首页 > 解决方案 > SQL Query 在 group by/aggregate 中不返回空值?

问题描述

我有这个 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

标签: sqlsql-servertsqlssmssql-server-2017

解决方案


评论中对此有所回答,但对于未来的读者,这里是您将使用的脚本以及为什么这样做很重要。

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 子句中的条件会在评估联接之前在表上进行评估(这在技术上可能不正确,但在我们看来就是这样)。


推荐阅读