我有3个表:
- 产品
- 组
- 销售额
产品表包含以下信息:
|**Product ID**|**Product Description**|
|--------------|-----------------------|
|1 |Wine |
|2 |Ruler |
|3 |Gas |
|4 |Water |
Groups表包含以下信息:
|**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 |
我原以为这只是一个使用左联接的问题,但它似乎不会让我回到我想要的结果(我不想省略未售出的产品或组(。
总之,我需要显示所有组和所有产品,无论它们是否出现在Sales表中。
我很感激对此事的任何反馈,关于在哪里看的指示,或者我可能缺少的任何逻辑!
编辑
我已经将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
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 s.daySold = '07-31-2016'
GROUP BY
g.GroupId
,p.ProductId
ORDER BY
g.GroupId
,p.ProductId
请注意,您提供的第1组产品4的预期结果是错误的,其中有2个在销售中。
您可以将所有产品与所有组连接起来(这样您就可以获得两者所有组合的列表(,然后添加附加信息(使用WHERE
语句根据您的条件过滤出结果(。
SELECT A.[Group ID]
, B.[Product ID]
, ISNULL([Amount Sold], 0) AS 'Amount Sold'
FROM Groups A
INNER JOIN Products B
ON 1 = 1
LEFT JOIN Sales C
ON C.[Group ID] = A.[Group ID]
AND C.[Product ID] = B.[Product ID]
WHERE [Day Sold] = '07-31-2016'