我有一个像这样的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查询
编辑:添加了否4.忘了以前添加它。我还需要一天的余额。
例如
Dr 105
,Cr 0
和balance 105
Dr 100
,Cr 20
和balance 185
仅供参考:日期列为timestamp
。
答案 0 :(得分:5)
答案 1 :(得分:5)
编辑:您在问题中添加了一些要求,以便每天只获得最后一笔余额,因此更新了查询。由于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
,那么查询应该可以非常直接地进行更新。
答案 2 :(得分:3)
SELECT
date,
SUM(IF(type='dr',amount,0)) Dr,
SUM(IF(type='cr',amount,0)) Dr,
balance as Balance
FROM transaction
WHERE date <= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY date
答案 3 :(得分:1)
此外,如果您在查询中需要两列Dr
和Cr
,那么:
SELECT DATE(date),
SUM(CASE WHEN type='dr' THEN amount ELSE 0 END ) as DR,
SUM(CASE WHEN type='cr' THEN amount ELSE 0 END ) as CR
FROM transaction
GROUP BY DATE(date)
ORDER BY DATE(date)
答案 4 :(得分:1)
由于这是一个mysql问题,您可以缩写查询:
SELECT
DATE(date) DATE
SUM((type='dr') * amount) as DR,
SUM((type='cr') * amount) as CR
FROM transaction
GROUP BY DATE(date)
ORDER BY DATE(date)
请注意,我不使用CASE或IF等,我只是将布尔测试结果乘以数量,因为在mysql中,true为1,false为0!