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

Sis*_*sir 2 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
Run Code Online (Sandbox Code Playgroud)

我可以使用SQL查询获取事务.这对我来说没问题.但我想要的是SQL查询

  1. 按天获取数据(过去30天)
  2. 如果在同一天有多个借方(dr)条目.总结一下.
  3. 如果在同一天有多个信用条目(cr).总结一下.
  4. 日结余额(所有余额均在每次借记或贷记完成时计算).因此,当天的最后一次进入是当天的最终平衡.

编辑:添加了否4.忘了以前添加它.我还需要一天的余额.

例如

  1. 对于第一天:Dr 105,Cr 0balance 105
  2. 对于第二天:Dr 100,Cr 20balance 185

仅供参考:日期栏是timestamp.

Mar*_*zek 5

用途GROUP BY:

SELECT DATE(date), type, SUM(amount)
FROM transaction
GROUP BY DATE(date), type
Run Code Online (Sandbox Code Playgroud)

工作演示


Joa*_*son 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);
Run Code Online (Sandbox Code Playgroud)

......或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);
Run Code Online (Sandbox Code Playgroud)

哪个更有效率,您必须测试您的数据,但特别是GROUP BY DATE(date)可能会导致一些麻烦,因此您可能希望将实际日期列添加到您可以分组的表中.

如果id您想要将其用作检测当天的最后一个信用卡/借记卡而不是date,那么查询应该非常直接地进行更新.

一个SQLfiddle来测试它们.