ВЫБЕРИТЕ в SQL Server, чтобы отобразить все отдельные строки из таблиц OnHand, Sale и Purchase, в которых либо / или поле Кол-во не пустое

#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