将2个查阅表连接到一个详细信息表



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

相关内容

最新更新