Полное внешнее соединение занимает только левую таблицу (но не где)

Я пришел к проблеме, которую, похоже, не могу решить. Это выглядит очень легко на бумаге, но, поскольку это все еще ново для меня, я думаю, я упускаю что-то очевидное..?

У меня есть 2 таблицы, которые содержат:

  • Кол-во: дата, код продукта и номер
  • Версия: дата, код продукта и доход

Желаемый результат: дата, код продукта, номер и доход (в основном, я хочу объединить их). Дело в том, что у меня могут быть продукты в 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

Тем не менее, я чувствую себя не в своей тарелке, так как, несмотря на все мои тесты, я постоянно пропускаю некоторые коды продуктов из таблицы Qty (однако у меня есть коды из Rev, которых нет в Qty).

Большинство ответов, которые я нашел в Интернете, относятся к некоторым конфликтам с предложением 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*.

1 ответ

Решение

Ваш GROUP BY является первичным на левой таблице.

Все несопоставленные строки будут иметь NULL значение для rev.date а также 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 как правило, иметь много NULL обработки.

Другие вопросы по тегам