Скорректировать запрос sum в SQL Server

Рейтинг: 0Ответов: 1Опубликовано: 16.01.2023

Есть таблица со списком данных по закупкам/продажам товара. В таблицу необходимо добавить данные по общему кол-ву товара в двух категориях: заказ на покупку/ счет-фактура продажи. Код написан:

 select order_type_id,
      product_id , sum(cnt) cnt_total 
      from operations_data group by order_type_id,
      product_id order by order_type_id

Далее из таблицы необходимо выделить остатки по всем позициям товаров на складе с учетом поступления (заказа) и отгрузки со склада (счет-фактуры). В итоговом варианте должен получиться список из товарных позиций с остатками по каждому товару.

Код:

select product_id, 
  ((select sum(cnt)
  from operations_data 
  where order_type_id = 2) -
  (select sum(cnt) 
  from operations_data 
  where order_type_id = 1)) Остаток_на_складе
from operations_data group by product_id 

считает остатки правильно, но выводит на каждую позицию общий итог -2202 вместо распределения по каждому товару

Для удобства есть https://dbfiddle.uk/nJDuyqdg

Ответы

▲ 0

Простой запрос, без подзапросов:

select product_id
  ,sum(case when order_type_id = 1 then cnt else 0 end) as totIn
  ,sum(case when order_type_id = 2 then cnt else 0 end) as totOut
  ,sum(case when order_type_id = 1 then cnt else 0 end) 
  -sum(case when order_type_id = 2 then cnt else 0 end) as totRest
from operations_data group by product_id 

С подзапросами

select product_id, 
  ((select sum(cnt)
  from operations_data t2
  where t2.order_type_id = 1 and t2.product_id=t1.product_id ) -
  (select sum(cnt) 
  from operations_data t3 
  where t3.order_type_id = 2 and t3.product_id=t1.product_id )) Остаток_на_складе
from operations_data t1 group by product_id 

Во втором случае null в данных или сумме может попортить отчет, нужно дополнительно проверять.