【发布时间】:2017-01-27 17:16:27
【问题描述】:
我有 3 张桌子:
- 产品
- 组
- 销售
产品表包含以下信息:
|**Product ID**|**Product Description**|
|--------------|-----------------------|
|1 |Wine |
|2 |Ruler |
|3 |Gas |
|4 |Water |
组表包含以下信息:
|**Group ID**|**Group Description**|
|------------|---------------------|
|1 |Cheetahs |
|2 |Elephants |
|3 |Cougars |
Sales 表包含以下信息:
|**GroupID**|**Product ID**|**Amount Sold**|**Day Sold**|
|-----------|--------------|---------------|------------|
|1 |2 | 3|07-31-2016 |
|1 |1 | 1|07-31-2016 |
|2 |3 | 5|07-31-2016 |
|1 |4 | 2|08-01-2016 |
现在我必须生成一个查询,它可以为我带来如下结果集(条件是我只想要 2016 年 7 月 31 日的结果):
|**Group ID**|**Product ID**|**Amount Sold**|
|------------|--------------|---------------|
|1 |1 |1 |
|1 |2 |3 |
|1 |3 |0 |
|1 |4 |0 |
|2 |1 |0 |
|2 |2 |0 |
|2 |3 |5 |
|2 |4 |0 |
|3 |1 |0 |
|3 |2 |0 |
|3 |3 |0 |
|3 |4 |0 |
我认为这只是使用左连接的问题,但它似乎不会让我恢复我正在寻找的结果(我不想省略未售出的产品或组)。
因此,总而言之,我需要显示所有组和所有产品,无论它们是否出现在销售表中。
我将不胜感激有关此问题的任何反馈、查看方向或我可能遗漏的任何逻辑!
编辑
我已将 Matt 的(非常感谢)帖子标记为答案,结果我从未使用过交叉连接。
我只在 Sales 表的左连接中添加了 where 子句,以便仅获得 2016 年 7 月 31 日的销售额
SELECT
g.GroupId
,p.ProductId
,SUM(COALESCE(s.AmountSold,0)) as AmountSold
FROM
Products p
CROSS JOIN Groups g
LEFT JOIN Sales s
ON p.ProductId = s.ProductId
AND g.GroupId = s.GroupId
AND daySold = '07-31-2016'
GROUP BY
g.GroupId
,p.ProductId
ORDER BY
g.GroupId
,p.ProductId
【问题讨论】:
-
您只需要在产品和组之间创建笛卡尔连接,然后将您的销售留给它。这可以通过交叉连接来完成
-
这是作业吗?
-
不是功课,也不是原来的问题,我以此作为参考解决另一种情况
-
@Matt 谢谢,我从来没有使用过交叉连接,我会研究一下
标签: sql sql-server database tsql reporting-services