Полное внешнее соединение занимает только левую таблицу (но не где)
Я пришел к проблеме, которую, похоже, не могу решить. Это выглядит очень легко на бумаге, но, поскольку это все еще ново для меня, я думаю, я упускаю что-то очевидное..?
У меня есть 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
обработки.