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.daterev.prdNULL 值,因此它们在结果集中全部合并为一行。

据推测,您打算:

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 处理。