我有一个像这样的mySQL表,表名是transaction
:
ID | date | amount | type | balance ---------------------------------------------------- 1 | day1 | 100 | dr | 100 2 | day1 | 5 | dr | 105 3 | day2 | 100 | dr | 205 4 | day2 | 20 | cr | 185 5 | day3 | 5 | cr | 180 .. and so on
我可以使用SQL查询获取事务.这对我来说没问题.但我想要的是SQL查询
按天获取数据(过去30天)
如果在同一天有多个借方(dr)条目.总结一下.
如果在同一天有多个信用条目(cr).总结一下.
日结余额(所有余额均在每次借记或贷记完成时计算).因此,当天的最后一次进入是当天的最终平衡.
编辑:添加了否4.忘了以前添加它.我还需要一天的余额.
例如
对于第一天:Dr 105
,Cr 0
和balance 105
对于第二天:Dr 100
,Cr 20
和balance 185
仅供参考:日期栏是timestamp
.
用途GROUP BY
:
SELECT DATE(date), type, SUM(amount)
FROM transaction
GROUP BY DATE(date), type
工作演示
编辑:您在问题中添加了一些要求,以便每天只获得最后一笔余额,因此更新了查询.由于MySQL缺少排名函数,因此我知道需要使用依赖子查询来完成它.
SELECT DATE(date) date, SUM(IF(type='dr',amount,0)) dr, SUM(IF(type='cr',amount,0)) cr, (SELECT balance FROM transaction t2 WHERE t2.date=MAX(t.date)) balance FROM transaction t GROUP BY DATE(date);
......或JOIN
......
SELECT DATE(t.date) date, SUM(IF(t.type='dr',t.amount,0)) dr, SUM(IF(t.type='cr',t.amount,0)) cr, t2.balance FROM transaction t JOIN transaction t2 ON DATE(t.date)=DATE(t2.date) AND t2.date IN (SELECT MAX(date) FROM transaction GROUP BY DATE(date)) GROUP BY DATE(t.date);
哪个更有效率,您必须测试您的数据,但特别是GROUP BY DATE(date)
可能会导致一些麻烦,因此您可能希望将实际日期列添加到您可以分组的表中.
如果id
您想要将其用作检测当天的最后一个信用卡/借记卡而不是date
,那么查询应该非常直接地进行更新.
一个SQLfiddle来测试它们.