我试图通过使用辅助表来使用组填补空白,你能帮忙吗?
处理没有订单的天数的辅助表
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
答案 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