将2个查找表加入详细信息表

时间:2016-09-19 22:17:23

标签: sql sql-server database tsql reporting-services

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

2 个答案:

答案 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个在销售中。