#sql #sql-server #sum #union #full-outer-join
#sql #sql-server #сумма #объединение #полное внешнее соединение
Вопрос:
Мне нужно написать SELECT
запрос в SQL Server, который использует JOIN
or UNION
, который выбирает отдельные ItmNo
Code
строки or из 3 таблиц OnHand
, Sale
и Purchase
.
Вот подробные сведения о таблицах, которые у меня есть, и о том, что мне нужно. ItmNo
и / или Code
столбцы могут использоваться в качестве внешних ключей для объединения таблиц.
Это мои входные таблицы-
Таблица OnHand
ID ItmNo Code Qty
----------------------------------
1 I001 001 100
2 I001 001 50
3 I003 003 300
Таблица Продажа
ID ItmNo Code Qty
----------------------------------
1 I001 001 100
2 I004 004
3 I003 003 120
Покупка таблицы
ID ItmNo Code Qty
----------------------------------
1 I005 005 10
2 I003 003 200
3 I003 003 300
И это то, что мне нужно в качестве вывода. ItmNo
Code
Здесь должны отображаться только отдельные и:
ID ItmNo Code SumQtyOnHand SumQtyOnSale SumQtyOnPurchase
------------------------------------------------------------------------------
1 I001 001 150 100
2 I003 003 300 120 500
3 I005 005 10
Ниже приведен SELECT
запрос, который я пробовал, но я не могу получить желаемый результат-
SELECT
A.ItmNo, A.Code,
A2.TOTAL SumQtyOnHand,
B.TOTAL SumQtyOnSale,
C.TOTAL SumQtyOnPurchase
FROM
dbo.OnHand A
LEFT JOIN
(SELECT ItmNo, Code, SUM(Qty) TOTAL
FROM dbo.OnHand
GROUP BY ItmNo, Code) A2 ON A.ItmNo = A2.ItmNo
LEFT JOIN
(SELECT ItmNo, Code, SUM(Qty) TOTAL
FROM dbo.Sale
GROUP BY ItmNo, Code) B ON A.ItmNo = A2.ItmNo
LEFT JOIN
(SELECT ItmNo, Code, SUM(Qty) TOTAL
FROM dbo.Purchase
GROUP BY ItmNo, Code) C ON A.ItmNo = A2.ItmNo
Пожалуйста, предложите исправление в SELECT
запросе для достижения вышеуказанного результата.
Заранее спасибо!
Комментарии:
1. Это было очень полезно. Спасибо! Что, если у меня есть пара столбцов в OnHand, которых нет в других таблицах Sale и Purchase? Как я могу выбрать их в приведенном выше запросе с помощью union all ? @GMB
Ответ №1:
Я думаю, что вы на правильном пути с подзапросами preagregation. Затем вы можете full join
. Синтаксис немного громоздкий в SQL Server, который не поддерживает using()
предложение:
select
coalesce(o.itmno, s.itemno, p.itemno) as itemno,
coalesce(o.code, s.code, p.code) as code,
o.SumQtyOnHand,
s.SumQtyOnSale,
p.SumQtyOnPurchase
from (
select itmno, code, sum(qty) SumQtyOnHand
from dbo.onhand
group by itmno, code
) o
full join (
select itmno, code, sum(qty) SumQtyOnSale
from dbo.sale
group by itmno, code
) s on s.itmno = o.itmno and s.code = o.code
full join (
select itmno, code, sum(qty) SumQtyOnPurchase
from dbo.purchase
group by itmno, code
) p on p.itemno = coalesce(s.itemno, o.itemno) and p.code = coalesce(s.code, o.code)
Это может быть проще выразить с union all
помощью и агрегирования:
select itemno, code,
sum(qtyOnHand) as SumQtyOnHand,
sum(qtyOnSale) as SumQtyOnSale,
sum(qtyOnPurchase) as SumQtyOnPurchase
from (
select itemno, code, qty as qtyOnHand, null as qtyOnSale, null as qtyOnPurchase from dbo.onhand
union all select itemno, code, null, qty, null from dbo.sale
union all select itemno, code, null, null, qty from dbo.purchase
) t
group by itemno, code
Комментарии:
1. Это было очень полезно. Спасибо! Что, если у меня есть пара столбцов в OnHand, которых нет в других таблицах Sale и Purchase? Как я могу выбрать их в приведенном выше запросе с помощью union all ? @GMB