【问题标题】:Join 2 Lookup Tables to a Detail table将 2 个查找表连接到一个详细信息表
【发布时间】: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


【解决方案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 个在销售中。

【讨论】:

  • 我需要提取 2016 年 7 月 31 日的所有销售额,当我这样做时,它只会让我恢复当天的销售额,而忽略其他组和产品,这就是我跳过的原因该组,因为它不应该包含在我的结果集中
【解决方案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'

【讨论】:

    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2018-07-01
    • 2014-09-03
    • 2018-07-26
    相关资源
    最近更新 更多