【问题标题】:How to group by date (SELECT if null then 0) MYSQL如何按日期分组(如果为空则选择 0)MYSQL
【发布时间】:2020-06-14 14:56:33
【问题描述】:

即使数据不存在,我如何获取按日期范围内的每一天分组的计数数据,即 IF 0 将选择 0

这是我的示例数据和查询MYSQL FIDDLE

输入

create table t_order(
  order_id int
  ,qty int
  ,time datetime 
);

insert into t_order values (1,2,'2020-02-17 08:00:00.000');
insert into t_order values (2,1,'2020-02-18 10:00:00.000');
insert into t_order values (3,3,'2020-02-20 08:00:00.000');
insert into t_order values (4,1,'2020-02-20 10:00:00.000');
insert into t_order values (5,7,'2020-02-21 08:00:00.000');
insert into t_order values (6,1,'2020-02-23 10:00:00.000');
insert into t_order values (7,1,'2020-02-24 08:00:00.000');
insert into t_order values (8,2,'2020-02-24 10:00:00.000');
insert into t_order values (9,1,'2020-02-25 08:00:00.000');
insert into t_order values (10,1,'2020-02-26 10:00:00.000');

实施

SELECT
  SUM(qty) as total,
  DATE(time) as date
FROM t_order
where 
  DATE(TIME) between date('2020-02-15') and date('2020-02-26')
GROUP BY CAST(time AS date)

实际输出

total   date
2   2020-02-17
1   2020-02-18
4   2020-02-20
7   2020-02-21
1   2020-02-23
3   2020-02-24
1   2020-02-25
1   2020-02-26

我的期望代码显示每个日期按范围日期参数事件数据为 0 或 null:

预期输出

  total date
0   2020-02-15
0   2020-02-16
2   2020-02-17
1   2020-02-18
0   2020-02-19
4   2020-02-20
7   2020-02-21
0   2020-02-22
1   2020-02-23
3   2020-02-24
1   2020-02-25
1   2020-02-26

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您只能选择数据库中存在的数据。

    要实现您想要的,请创建一个单独的表(临时或永久日历表),其中包含所需日期范围内的所有日期,并将其包含(连接)到您的查询中。

    【讨论】:

      【解决方案2】:

      您应该创建一个日历表。如果您使用 MariaDB(以上 v10.1),有一种简单的方法可以生成临时日历表。然而,使用 MySQL,您将使用更长的查询(虽然不确定在最新的 MySQL 版本中)。请参考以下示例:

      SELECT ADDDATE('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) as dates FROM
      (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
      (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
      (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
      (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
      (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4;
      

      这将在 MySQL 中生成从 '1970-01-01' 到 '2243-10-16' 的日期范围,但当然您可以相应地更改它。为了创建一个calendar 表,我在这里准备了一个小提琴:https://www.db-fiddle.com/f/qVgmfDaVUszABAyFzH7iUS/3

      我之前在这里也提供过更短日期范围的建议:https://stackoverflow.com/a/58443510/10910692 包括 MariaDB 建议;生成日期/日历的查询要短得多。

      现在,如果您不创建 calendar 表,使用此方法您的查询将如下所示:

      SELECT IFNULL(B.Total,0) AS Total, A.dates AS Date FROM
      (SELECT ADDDATE('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) as dates FROM
      (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
      (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
      (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
      (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
      (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4) A 
      LEFT JOIN
      (SELECT
        SUM(qty) as total,
        DATE(time) as date
      FROM t_order
      where 
        DATE(TIME) between date('2020-02-15') and date('2020-02-26')
      GROUP BY CAST(time AS date)) B 
      ON A.dates=B.date
      WHERE A.dates BETWEEN '2020-02-15 and '2020-02-26';
      

      它看起来很长而且没有必要。但是对于calendar 表,您只需要这样做:

      SELECT IFNULL(B.Total,0) AS Total, A.dates AS Date 
      FROM calendar A
      LEFT JOIN
      (SELECT
        SUM(qty) as total,
        DATE(time) as date
      FROM t_order
      where 
        DATE(TIME) between date('2020-02-15') and date('2020-02-26')
      GROUP BY CAST(time AS date)) B 
      ON A.dates=B.date
      WHERE A.dates BETWEEN '2020-02-15 and '2020-02-26';
      

      【讨论】:

        猜你喜欢
        • 2016-07-02
        • 2017-06-28
        • 2015-03-31
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-03
        相关资源
        最近更新 更多