SQL查询不会按分组/聚合返回空值?

时间:2018-11-06 21:16:43

标签: sql sql-server tsql ssms sql-server-2017

我有这个SQL查询,每个商店每天返回产品sku的总和。它跳过不返回任何值的商店/名称。

当前输出为:

day     location sku totalSold
1/1/18     1      1      2
1/2/18     2      2      1
1/4/18     1      4      3

我希望输出更像:

day     location sku totalSold
1/1/18     1      1      2
1/1/18     1      2      0
1/1/18     1      3      0
1/1/18     1      4      3
1/1/18     2      1      2
1/1/18     2      2      0
1/1/18     2      3      0
1/1/18     2      4      0
1/2/18     1      1      2
1/2/18     1      2      0
1/2/18     1      3      0

这是我当前的sql查询:

SELECT tb1.timestamp, tb1.store, tbl2.sku, SUM(CAST(tbl2.quantity as integer)) as 'totalSold'
FROM tb1
LEFT JOIN tbl2 on tbl1.id = tbl2.id
WHERE tbl2.sku IN (select sku from tbl3) --tbl3 is a view w/ list of skunames
GROUP BY tbl1.Timestamp, YEAR(timestamp), MONTH(timestamp), DAY(timestamp), tbl1.store, tbl2.sku

1 个答案:

答案 0 :(得分:0)

它在评论中得到了一定的回答,但是对于将来的读者来说,这是您将使用的脚本以及为什么这样做很重要。

SELECT tb1.timestamp, tb1.store, tbl2.sku, SUM(CAST(tbl2.quantity as integer)) as 'totalSold'
FROM tb1
LEFT JOIN tbl2 on tbl1.id = tbl2.id AND tbl2.sku IN (select sku from tbl3) --tbl3 is a view w/ list of skunames
GROUP BY tbl1.Timestamp, YEAR(timestamp), MONTH(timestamp), DAY(timestamp), tbl1.store, tbl2.sku

原始查询强制将LEFT JOIN视为INNER JOIN,因为只能针对WHERE子句条件评估联接返回的记录。通过将以tbl2.sku开头的部分移到LEFT JOIN中,可以在对联接进行求值之前在表上对WHERE子句中先前的条件求值(这在技术上可能不是正确的,但对我们来说是这样)。