【问题标题】:Get Sum and sum of last 24 hours in a single query in mysql在mysql中的单个查询中获取过去24小时的总和和总和
【发布时间】:2021-02-23 14:56:21
【问题描述】:

如何在单个查询中获得总和和最后一天的总和以及计数,

这里是样本数据。

+----+-----------------+---------------------+
| id | transfer_amount | addedon             |
+----+-----------------+---------------------+
|  1 |      50000.0000 | 2020-02-20 10:51:12 |
|  2 |       2000.0000 | 2020-02-20 10:52:57 |
|  3 |      10000.0000 | 2020-02-17 10:53:37 |
|  4 |       7000.0000 | 2020-02-17 10:54:28 |
|  5 |        500.0000 | 2020-02-17 10:55:07 |
| 23 |       1000.0000 | 2020-02-19 17:37:06 |
| 24 |       1000.0000 | 2020-02-19 17:41:12 |
| 25 |       1000.0000 | 2020-02-19 17:46:48 |
| 26 |       1000.0000 | 2020-02-19 17:47:17 |
| 30 |       1000.0000 | 2020-02-19 17:58:38 |
+----+-----------------+---------------------+

我试图给出查询,

select SUM(amount) as total_amount, COUNT('ALL') as total_count, 
    (select SUM(amount) from `transfers`WHERE date > '2021-01-04 23:59:59' AND 
      date <= '2021-01-05 23:59:59') as last_day_sum
from `transfers`;

结果

+----------------+-------------+--------------+----------------+
| total_amount   | total_count | last_day_sum | last_day_count |
+----------------+-------------+--------------+----------------+
| 314286380.0000 |       88452 |    1200.0000 |        0       |
+----------------+-------------+--------------+----------------+

还有其他选择吗?

【问题讨论】:

  • WHERE date &gt; '2021-01-04 23:59:59' AND date &lt;= '2021-01-05 23:59:59' 没有名为date 的列。即使有,你也必须在它周围加上反引号,因为date 是一个保留字。
  • @kmoser 日期不是保留字

标签: mysql


【解决方案1】:

你可以使用这个查询

select SUM(amount) as total_amount, COUNT('ALL') as total_count, 
    SUM(case when date > '2021-01-04 23:59:59' AND 
      date <= '2021-01-05 23:59:59' then amount else 0 end) as last_day_sum
from `transfers`;

更新最后一天的计数

select SUM(amount) as total_amount, COUNT('ALL') as total_count, 
   SUM(case when date > '2021-01-04 23:59:59' AND 
      date <= '2021-01-05 23:59:59' then amount else 0 end) as last_day_sum, 
   SUM(date > '2021-01-04 23:59:59' AND 
      date <= '2021-01-05 23:59:59') as last_day_count
from `transfers`;

更短的代码

select sum(transfer_amount) as total_amount, count(*) as total_count, 
   sum(if(date(`date`) = '2021-01-05', transfer_amount, 0)) as last_day_sum, 
   sum(date(`date`) = '2021-01-05') as last_day_count
from `transfers`;

【讨论】:

  • 这对计数是否也正确,select SUM(amount) as total_amount, COUNT('ALL') as total_count, SUM(case when date &gt; '2021-01-04 23:59:59' AND date &lt;= '2021-01-05 23:59:59' then amount else 0 end) as last_day_sum, COUNT(case when date &gt; '2021-01-04 23:59:59' AND date &lt;= '2021-01-05 23:59:59' then amount else 0 end) as last_day_count from transfers;
  • 是的,你也可以更短,看答案
  • 仅获取总计数的最后一天计数。
  • @noushidp 它应该可以正常工作,检查您的条件。仅供参考:sqlfiddle.com/#!9/daabea/8
  • '@girish'在这个表中有超过100万条记录,所以查询会太慢,如何减少查询执行时间。列索引已经有了。
【解决方案2】:
select SUM(transfer_amount) as total_amount, COUNT(*) as total_count, 
    (select ifnull(SUM(transfer_amount),0) from transfers WHERE date(addedon) = '2020-02-19') as last_day_sum
from transfers;

您必须将日期字符串转换为日期类型。
此外,由于您只需要日期,因此可以将其减少到上面的日期,而不是 where x and y。 这将给出同一查询中过去 24 小时的总和。

【讨论】:

  • 列名是虚拟的,我需要逻辑,
  • 进行了更改。请检查。您的虚拟数据和查询在 dat 范围之间没有任何数据,因此返回。
猜你喜欢
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 2019-04-29
  • 1970-01-01
  • 2019-07-01
  • 2020-07-24
  • 1970-01-01
相关资源
最近更新 更多