我有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 |
现在我必须生成一个查询,它可以为我提供如下结果集(条件是我只需要从07-31-2016获得结果):
|**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表中都有外观。
我很感激有关此事的任何反馈,关于在哪里查看的指示或我可能遗失的任何逻辑!
我已将马特(非常感谢)帖子标记为答案,原来我从未使用过交叉加入。
我只在Sales表的左连接中添加了where子句,以便只获得07-31-2016所做的销售
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
答案 0 :(得分:1)
您可以将所有产品加入所有组(以便获得两者的所有组合的列表),然后添加其他信息(根据您的条件使用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'
答案 1 :(得分:1)
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个在销售中。