【问题标题】:SQL Query doesn't return nulls in group by/aggregate?SQL Query 在 group by/aggregate 中不返回空值?
【发布时间】:2018-11-06 21:16:42
【问题描述】:

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

【问题讨论】:

  • 将 tbl2 条件从 where 子句中取出,放入连接的 ON 子句中。否则左连接行为被修改,结果集将仅包含来自 tb1 的记录,其中也满足 tb2 条件。 # 不会开始评论,因此您发布的代码不会解析。
  • 我猜你想交叉加入你的日期/位置/skus,然后使用左加入来获得总销量。有多种方法可以做到这一点,具体取决于实际要求(由于某种原因,当前输出中的 sku 为 4,但未显示在所需的输出中,所以我不确定该怎么做是)。
  • 谢谢!!我匆忙用python在这个问题中添加了评论,但它根本不在实际查询中。
  • 去掉where子句会发生什么?
  • @MEdwin 它将返回 tbl2 中的所有 sku(数千个),而我只希望返回大约 30 个,而 tbl3 只是这 30 个 sku 的视图。

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


【解决方案1】:

在 cmets 中得到了一些回答,但对于未来的读者,这里是您将使用的脚本以及为什么这样做很重要。

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

【讨论】:

  • 谢谢。这也没有考虑到它需要的任何空数据(或 0)。所以我也在那里添加了一个交叉连接,现在我的临时运行存储空间已经用完了。
  • 如果您添加脚本来创建表并用可用于生成预期结果的数据填充它们,我将更新我的查询以生成结果。
猜你喜欢
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
相关资源
最近更新 更多