我有这个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
答案 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子句中先前的条件求值(这在技术上可能不是正确的,但对我们来说是这样)。