我正在尝试按公司和日期创建一个小时列表,即使公司没有该日期的数据。我试过加入一个日历表,对它的日期和公司进行分组,但没有效果。
SELECT cal.date, comp.name, comp.hours
FROM company AS comp
LEFT JOIN calendar AS cal ON cal.date=comp.date
GROUP BY cal.date, comp.name
我希望在公司没有该日期的工作时间时得到空输出,例如:
2018-01-01 Company A 100
2018-01-01 Company B NULL
2018-01-02 Company A NULL
2018-01-02 Company B NULL
2018-01-03 Company A 100
2018-01-03 Company B 50
但它只返回可以找到数据的行,就像我使用了内部连接一样。任何帮助都将不胜感激。谢谢您!
2条答案
按热度按时间9lowa7mx1#
你犯了3个错误,其中2个是相关的:
您交换了联接中表的顺序(易于修复)
您的查询没有反映您声明的意图(更难修复)
您正在使用
GROUP BY
当它是不必要的(在这种特殊情况下无关)我会关注2。你接近你的目标,但不是全部。修复第一个和第三个错误,下面是您的问题:
它将执行以下操作:
所以您的查询保证每个日期至少有一个输出行。你要找的是每个日期,每个公司一个输出行。一种方法是创建一个中间表,然后左键连接到该表:
http://sqlfiddle.com/#!2010年11月9日
这与您想要的输出相匹配。
ohfgkhjo2#
您可以使用日历作为左表,这样您将获得所有日期
我没有找到任何聚合函数,所以我删除了groupby