MYSQL填写小组"空白"

时间:2014-12-29 21:05:30

标签: mysql sql group-by left-join

我试图通过使用辅助表来使用组填补空白,你能帮忙吗?

处理没有订单的天数的辅助表

date        quantity
2014-01-01  0
2014-01-02  0
2014-01-03  0
2014-01-04  0
2014-01-05  0
2014-01-06  0
2014-01-07  0

按“订单”表

的结果进行分组
date        quantity
2014-01-01  7
2014-01-02  1
2014-01-04  2
2014-01-05  3

将“订单”表与“辅助表”

连接起来的结果
date        quantity
2014-01-01  7
2014-01-02  1
2014-01-03  0
2014-01-04  2
2014-01-05  3
2014-01-06  0
2014-01-07  0

3 个答案:

答案 0 :(得分:1)

在不知道如何创建group by result表格的情况下,您在outer join中寻找的内容,可能是coalesce。像这样:

select distinct a.date, coalesce(b.quantity,0) quantity
from aux a 
    left join yourgroupbyresults b on a.date = b.date

请注意,您可能需要distinct,也可能不需要{ - 取决于您的数据。


编辑,鉴于您的意见,这应该有效:

select a.date, count(b.date_sent)
from aux a
    left join orders b on a.date = date_format(b.date_sent, '%Y-%m-%d')
group by a.date

答案 1 :(得分:1)

使用您的结果将类似于:

SELECT a.date
      ,COALESCE(b.quantity,0) as quantity
FROM auxtable a
LEFT JOIN groupbyresult b
  ON a.date = b.date

您也可以在与左连接相同的查询中进行分组:

SELECT a.date
      ,COALESCE(COUNT(b.somefield),0) as quantity
FROM auxtable a
LEFT JOIN table1 b
  ON a.date = b.date
GROUP BY a.date

答案 2 :(得分:0)

解决此类问题的一种常见方法是使用具有要返回的不同日期列表的行源,然后对具有间隙的表执行外部联接。这样,您可以获得所有日期,并且可以用零替换“缺失”数量值。

例如:

SELECT d.date
     , IFNULL(SUM(s.quantity),0) AS quantity
  FROM distinct_list_of_dates d
  LEFT
  JOIN information_source s
    ON s.date = d.date
 GROUP BY d.date

目前尚不清楚为什么GROUP BY会消除某些日期值。我们可能会猜测您正在使用ANSI扩展到ANSI标准GROUP BY语义,这就是消除行。或者,您可能有一个排除行的WHERE子句。但我们只是在猜测。


关注根据OP在评论中披露的更多信息......

在上面的查询中,将distinct_list_of_dates替换为aux,并将information_source替换为orders,并调整联接谓词以考虑日期时间与日期的比较

SELECT d.date
     , IFNULL(SUM(s.quantity),0) AS quantity
  FROM aux d
  LEFT
  JOIN orders s
    ON s.date >= d.date
   AND s.date <  d.date + INTERVAL 1 DAY
 GROUP BY d.date