sql - 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
解决方案
评论中对此有所回答,但对于未来的读者,这里是您将使用的脚本以及为什么这样做很重要。
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 子句中的条件会在评估联接之前在表上进行评估(这在技术上可能不正确,但在我们看来就是这样)。
推荐阅读
- python - uWSGI 应用程序找不到挂载点,但加载了 html
- c# - 如何将返回代码添加到位于单独的 xaml 文件(没有 .cs 文件相关)中的数据模板控件的事件?
- javascript - 弹性 - 优先排序值
- android - 键盘向上滑动并覆盖 Flutter 中的 TextField
- python - 如何获取属性的实际文档字符串
- r - r中特定时间范围的时间平均值
- html - 如何将 LinearGradient 保存到数据库
- xamarin - 富文本块中的虚线下划线
- javascript - 如果您在模态框内开始或结束点击事件,如何防止简单的 React 模态框被关闭?
- plsql - 为什么 SQL 时间戳不打印时间?