Скорректировать запрос sum в SQL Server
Есть таблица со списком данных по закупкам/продажам товара. В таблицу необходимо добавить данные по общему кол-ву товара в двух категориях: заказ на покупку/ счет-фактура продажи. Код написан:
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
Ответы (1 шт):
Простой запрос, без подзапросов:
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 в данных или сумме может попортить отчет, нужно дополнительно проверять.