如何在同一天mySQL中获得唯一的值总和

时间:2013-12-26 07:18:32

标签: mysql sql database

我有一个像这样的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查询

  1. 按天(最近30天)获取数据
  2. 如果在同一天有多个借方(dr)条目。总结一下。
  3. 如果在同一天有多个学分(cr)。总结一下。
  4. 日结余额(所有余额均在每次借记或贷记完成时计算)。因此,当天的最后一次进入是当天的最终余额。
  5. 编辑:添加了否4.忘了以前添加它。我还需要一天的余额。

    例如

    1. 第一天:Dr 105Cr 0balance 105
    2. 第2天:Dr 100Cr 20balance 185
    3. 仅供参考:日期列为timestamp

5 个答案:

答案 0 :(得分:5)

使用GROUP BY

SELECT DATE(date), type, SUM(amount)
FROM transaction
GROUP BY DATE(date), type

工作demo

答案 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,那么查询应该可以非常直接地进行更新。

An SQLfiddle to test both

答案 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)

此外,如果您在查询中需要两列DrCr,那么:

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!

相关问题