Full Outer Join Takes Only Left Table(但没有 where 子句)
Full Outer Join Takes Only Left Table (but no where clause)
我遇到了一个似乎无法解决的问题。这在纸面上看起来很简单,但由于这对我来说仍然是新的,我想我遗漏了一些明显的东西..?
我有 2 个 table 包含:
- 数量:日期、产品代码和编号
- 修订:日期、产品代码和收入
期望的输出是:Date、Product Code、Number 和 Revenue(基本上,我想合并它们)。问题是,我可能有 Qty 中不存在于 Rev 中的产品,以及 Rev 中不存在于 Qty 中的产品。我的猜测是使用以下代码:
SELECT Rev.Date
,ISNULL(rev.Prd,Qty.Prd) as ProductCode
,ISNULL(Sum(Number),0) as Number
,ISNULL(SUM(Revenue),0) as Revenue
FROM Rev
FULL OUTER JOIN Qty ON rev.Date=Qty.Date AND rev.Prd=Qty.Prd
GROUP BY rev.Date, rev.Prd, Qty.Prd
ORDER BY rev.Date
然而,尽管我进行了所有测试,我还是感到绝望,但我仍然遗漏了数量 table 中的一些产品代码(但是我确实有来自 Rev 的那些不在数量中的代码)。
我在网上找到的大部分答案都提到了与Where子句的一些冲突,但我没有。我在这里误解了什么吗?谢谢!
编辑:
这是我的数据:
TABLE Rev TABLE Qty
Date | Prd | Revenue Date | Prd | Number
------------|---------|----------- ------------|---------|-------
07/09/2018 | ProdA | 100 07/09/2018 | ProdA | 1
07/09/2018 | ProdB | 200 07/09/2018 | ProdB | 1
07/09/2018 | ProdC | 0 07/09/2018 | ProdC | 1
07/09/2018 | ProdD | 150 07/09/2018 | ProdD | 3
07/09/2018 | ProdE | 0 07/09/2018 | ProdE | 1
07/09/2018 | ProdF | 0 07/09/2018 | ProdF | 2
07/09/2018 | ProdH | 120 07/09/2018 | ProdH | 8
07/09/2018 | ProdI | 200 07/09/2018 | ProdI | 3
07/09/2018 | ProdX | 500 07/09/2018 | PRODZ*| 1
低于我当前的输出以及期望的输出:
OUTPUT DESIRED
Date | Prd | Number |Revenue Date | Prd | Number |Revenue
------------|---------|------------------ ------------|----------|-----------------
07/09/2018 | ProdA | 1 |100 07/09/2018 | ProdA | 1 |100
07/09/2018 | ProdB | 1 |200 07/09/2018 | ProdB | 1 |200
07/09/2018 | ProdC | 1 |0 07/09/2018 | ProdC | 1 |0
07/09/2018 | ProdD | 3 |150 07/09/2018 | ProdD | 3 |150
07/09/2018 | ProdE | 1 |0 07/09/2018 | ProdE | 1 |0
07/09/2018 | ProdF | 2 |0 07/09/2018 | ProdF | 2 |0
07/09/2018 | ProdH | 8 |120 07/09/2018 | ProdH | 8 |120
07/09/2018 | ProdI | 3 |200 07/09/2018 | ProdI | 3 |200
07/09/2018 | ProdX | 0 |500 07/09/2018 | ProdX | 0 |500
07/09/2018 | PRODZ*| 1 |0
PRODZ* 是我所有测试中缺少的那个。
你的 GROUP BY
是左边的小学 table。
所有不匹配的行都将具有 rev.date
和 rev.prd
的 NULL
值,因此它们在结果集中全部合并为一行。
据推测,您打算:
SELECT COALESCE(Rev.Date, qty.Date) as date
COALESCE(rev.Prd, Qty.Prd) as ProductCode
COALESCE(Sum(Number), 0) as Number
COALESCE(SUM(Revenue), 0) as Revenue
FROM Rev FULL OUTER JOIN
Qty
ON rev.Date = Qty.Date AND rev.Prd = Qty.Prd
GROUP BY COALESCE(Rev.Date, qty.Date), COALESCE(rev.Prd, Qty.Prd)
ORDER BY COALESCE(Rev.Date, qty.Date);
具有 FULL JOIN
的查询往往有很多 NULL
处理。
我遇到了一个似乎无法解决的问题。这在纸面上看起来很简单,但由于这对我来说仍然是新的,我想我遗漏了一些明显的东西..?
我有 2 个 table 包含:
- 数量:日期、产品代码和编号
- 修订:日期、产品代码和收入
期望的输出是:Date、Product Code、Number 和 Revenue(基本上,我想合并它们)。问题是,我可能有 Qty 中不存在于 Rev 中的产品,以及 Rev 中不存在于 Qty 中的产品。我的猜测是使用以下代码:
SELECT Rev.Date
,ISNULL(rev.Prd,Qty.Prd) as ProductCode
,ISNULL(Sum(Number),0) as Number
,ISNULL(SUM(Revenue),0) as Revenue
FROM Rev
FULL OUTER JOIN Qty ON rev.Date=Qty.Date AND rev.Prd=Qty.Prd
GROUP BY rev.Date, rev.Prd, Qty.Prd
ORDER BY rev.Date
然而,尽管我进行了所有测试,我还是感到绝望,但我仍然遗漏了数量 table 中的一些产品代码(但是我确实有来自 Rev 的那些不在数量中的代码)。
我在网上找到的大部分答案都提到了与Where子句的一些冲突,但我没有。我在这里误解了什么吗?谢谢!
编辑: 这是我的数据:
TABLE Rev TABLE Qty
Date | Prd | Revenue Date | Prd | Number
------------|---------|----------- ------------|---------|-------
07/09/2018 | ProdA | 100 07/09/2018 | ProdA | 1
07/09/2018 | ProdB | 200 07/09/2018 | ProdB | 1
07/09/2018 | ProdC | 0 07/09/2018 | ProdC | 1
07/09/2018 | ProdD | 150 07/09/2018 | ProdD | 3
07/09/2018 | ProdE | 0 07/09/2018 | ProdE | 1
07/09/2018 | ProdF | 0 07/09/2018 | ProdF | 2
07/09/2018 | ProdH | 120 07/09/2018 | ProdH | 8
07/09/2018 | ProdI | 200 07/09/2018 | ProdI | 3
07/09/2018 | ProdX | 500 07/09/2018 | PRODZ*| 1
低于我当前的输出以及期望的输出:
OUTPUT DESIRED
Date | Prd | Number |Revenue Date | Prd | Number |Revenue
------------|---------|------------------ ------------|----------|-----------------
07/09/2018 | ProdA | 1 |100 07/09/2018 | ProdA | 1 |100
07/09/2018 | ProdB | 1 |200 07/09/2018 | ProdB | 1 |200
07/09/2018 | ProdC | 1 |0 07/09/2018 | ProdC | 1 |0
07/09/2018 | ProdD | 3 |150 07/09/2018 | ProdD | 3 |150
07/09/2018 | ProdE | 1 |0 07/09/2018 | ProdE | 1 |0
07/09/2018 | ProdF | 2 |0 07/09/2018 | ProdF | 2 |0
07/09/2018 | ProdH | 8 |120 07/09/2018 | ProdH | 8 |120
07/09/2018 | ProdI | 3 |200 07/09/2018 | ProdI | 3 |200
07/09/2018 | ProdX | 0 |500 07/09/2018 | ProdX | 0 |500
07/09/2018 | PRODZ*| 1 |0
PRODZ* 是我所有测试中缺少的那个。
你的 GROUP BY
是左边的小学 table。
所有不匹配的行都将具有 rev.date
和 rev.prd
的 NULL
值,因此它们在结果集中全部合并为一行。
据推测,您打算:
SELECT COALESCE(Rev.Date, qty.Date) as date
COALESCE(rev.Prd, Qty.Prd) as ProductCode
COALESCE(Sum(Number), 0) as Number
COALESCE(SUM(Revenue), 0) as Revenue
FROM Rev FULL OUTER JOIN
Qty
ON rev.Date = Qty.Date AND rev.Prd = Qty.Prd
GROUP BY COALESCE(Rev.Date, qty.Date), COALESCE(rev.Prd, Qty.Prd)
ORDER BY COALESCE(Rev.Date, qty.Date);
具有 FULL JOIN
的查询往往有很多 NULL
处理。