我遇到了一个似乎无法解决的问题。在纸上看起来很简单,但是由于这对我来说仍然很新,我想我缺少明显的东西了。
我有2个表,其中包含:
所需的输出是:日期,产品代码,编号和收入(基本上,我想将它们合并)。问题是,我可能有一些数量在Rev中不存在的产品,而某些产品在Rev中不存在于Rev中。我的猜测是使用以下代码:
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
但是,尽管我进行了所有测试,但我还是感到绝望,尽管我仍然在“数量”表中缺少一些产品代码(但是,我确实有来自Rev的产品代码不在“数量”中)。
我在网上找到的大多数答案都与“地方条款”存在某些冲突,但我没有任何冲突。我在这里误会什么吗?谢谢!
编辑: 这是我的数据:
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 *是我所有测试中缺少的一个。
答案 0 :(得分:2)
您的GROUP BY
在左表中是主要的。
所有不匹配的行将分别具有NULL
和rev.date
的{{1}}值,因此将它们全部合并为结果集中的一行。
大概是您打算的:
rev.prd
使用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
。