使用 MySQL 获取按货币分组的交易合并总额
介绍
本指南将介绍如何使用 MySQL 对包含交易信息的数据表执行操作。我们的主要示例将涉及货币交易。
交易和表数据
考虑一个数字交易,其中值存储在一个地方,而上下文存储在其他地方。例如,当发生现金交易时,我们可以在一个表中表示现金交易的方向,在另一个表中表示金额,以避免出现负数。同样,有很多论坛和在线评论系统,您可以在其中投赞成票或反对票。这些投票将与其各自的计数分开存储,从而具有完全正值,但它们将通过外键链接到包含每个投票的原始值的表,无论它们是正数还是负数。
金钱交易例子
我遇到了与不同货币交易相关的类似问题。交易类型将决定它是入账交易还是出账交易。针对同样的情况进行建模,我们今天将研究三件事:
- 根据交易的价值将其连接起来。
- 根据值的关系创建一个乘数。
- 创建按不同货币和用户分组的合并总额。
分组
分组时,聚合函数是关键。我们将对包含财务详细信息的示例表应用某些聚合函数。本文提供了该表的数据定义语言 (DDL)。
该表的结构如下:
柱子 | 类型 |
---|---|
转移ID | int(11) 自动递增 |
主题 | varchar(100) |
数量 | 十进制(7,2) |
货币 | 炭(3) |
方向 | int(11) |
用户身份 | int(11) |
时间戳 | 时间戳 [CURRENT_TIMESTAMP] |
对于此表,我添加了一个新列来指示方向。1表示贷方,2表示借方。值1和2对我们来说没有任何意义,但它们可作为保存值的另一个表的外键。我有意使用正数来模拟现实世界的情况。
请考虑下面显示的示例数据集,它代表一个用户的值:
转移ID | 主题 | 数量 | 货币 | 方向 | 用户身份 | 时间戳 |
---|---|---|---|---|---|---|
1 | 薪水 | 2000.00 | 美元 | 1 | 1 | 2017-05-12 09:15:56 |
2 | 售出电视 | 150.00 | 英镑 | 1 | 1 | 2017-05-12 09:16:23 |
3 | 移动帐单 | 25.00 | 英镑 | 2 | 1 | 2017-05-12 09:19:03 |
4 | 房屋租金 | 1500.00 | 美元 | 2 | 1 | 2017-05-12 09:21:03 |
5 | 食物 | 10.00 | 英镑 | 2 | 1 | 2017-05-12 09:24:33 |
6 | 互联网账单 | 250.00 | 美元 | 2 | 1 | 2017-05-12 09:26:03 |
7 | 增值税 | 100.00 | 英镑 | 2 | 1 | 2017-05-12 09:26:45 |
8 | 信用卡帐单 | 150.00 | 美元 | 2 | 1 | 2017-05-12 09:27:46 |
9 | 进口费用 | 75.00 | 美元 | 2 | 1 | 2017-05-12 12:27:46 |
10 | 现金提款 | 20.00 | 美元 | 2 | 1 | 2017-05-12 12:28:20 |
获取总金额。
要获取所有金额的总和,请使用SUM和GROUP BY函数。在上述情况下,我们将使用以下查询来获取所有交易的总和,无论用户、方向和/或货币如何。
SELECT SUM(`Amount`) AS `Total` FROM `transactions`;
上面将会输出类似这样的内容:
全部的 |
---|
4185.00 |
信用卡和借记卡
这不是我们的理想情况。我们有不同的行获得不同的值。最重要的是,借记金额应该从值中减去。在这种情况下,我们可以使用GROUP BY函数拆分收入和支出,这给了我们以下查询:
SELECT SUM(`Amount`) AS `Total` FROM `transactions` GROUP BY `Direction`;
上述查询将产生以下形式的结果:
全部的 |
---|
2150.00 |
2130.00 |
该表表示所有朝同一方向进行的交易总额的列表。
不同的货币
用同样的方法,我们将能够通过用逗号分隔的列名来添加另一个分组。因此,如果我们需要添加下一阶段的分组,让我们以这种方式添加货币列:
SELECT SUM(`Amount`) AS `Total` FROM `transactions` GROUP BY `Direction`, `Currency`;
以上结果:
全部的 |
---|
150.00 |
2000.00 |
135.00 |
1995.00 |
如上所示,此命令会在数据中创建额外的拆分。通过添加货币类别,我们首先按方向分组,然后按货币分组,从而得到四个不同的值。
但是,我们的输出相当混乱,因为我们不知道每个数字代表什么。让我们添加更多列来揭示行的含义:
SELECT SUM(`Amount`) AS `Total`, `Currency`, `Direction` FROM `transactions` GROUP BY `Direction`, `Currency`;
查询现在看起来更好:
全部的 | 货币 | 方向 |
---|---|---|
150.00 | 英镑 | 1 |
2000.00 | 美元 | 1 |
135.00 | 英镑 | 2 |
1995.00 | 美元 | 2 |
与初始数据集相比,您能看出GROUP BY命令对我们的查询有什么影响吗?值按GROUP BY方案指定的顺序显示。输出首先按Direction 排序,然后按Currency排序,从GBP在字母表中排在USD之前可以看出。</fon
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~