SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Microsoft SQL Server » Найти разницу между поступлением и реализацией в таблице (Операции вычитания количества между поступлением и реализацией)
Найти разницу между поступлением и реализацией в таблице [сообщение #6126] Tue, 24 June 2025 11:23 Переход к следующему сообщению
mrtoad в настоящее время не в онлайне  mrtoad
Сообщений: 2
Зарегистрирован: June 2025
Junior Member
Приветствую!
Я начинающий аналитик и я уже всю голову сломал как мне написать правильный запрос.
Есть таблица содержащая поступления и реализации. Мне нужно посчитать остатки на складе.
Я не нашел ничего лучше, чем использовать временные таблицы и соединить их через JOIN.
У меня все корректно посчиталось кроме одной строки (в одной таблице эта строка присутствует, в другой нет.

Напишу все запросы, может быть подскажите более элегантный вариант...

Есть таблица с данными - operations_data (содержит поступления и реализации)
select top 10 * from operations_data
dt	              tm	order_number	order_type_id	product_category_id	product_id	manufacturer_id	cnt	price	selling_price
2000-07-30	09:32:00.0000000	1	       1	              2	              5	         2	        5400	3.2	null
2000-07-30	09:55:00.0000000	1	       2	              2	              5	         2	        2870	3.2	3.33
2000-08-04	10:10:00.0000000	2	       2	              2	              5	         2	        2336	3.2	3.48
2000-08-04	11:04:00.0000000	3	       2	              2	              5	         2	        26	3.2	3.58
2000-08-04	11:21:00.0000000	4	       2	              2	              5	         2	        9	3.2	3.28
2000-08-04	12:01:00.0000000	5	       2	              2	              5	         2	        36	3.2	3.41
2000-08-08	11:49:00.0000000	6	       2	              2	              5	         2	        48	3.2	3.38
2000-08-08	12:29:00.0000000	7	       2	              2	              5	         2	        7	3.2	3.58
2000-08-08	13:16:00.0000000	8	       2	              2	              5	         2	        57	3.2	3.31
2000-08-08	13:19:00.0000000	2	       1	              1	              8	         1	        400	16.49	null
Есть справочники: order_type (содержит типы операций и их идентификаторы) и product (содержит названия товаров и их идентификаторы)

Я создал две таблицы: purch и sales, в которые поместил данные по суммарному количеству закупок и продаж

create table purch (
  product varchar(255),
  cnt int
)

create table sales (
  product varchar(255),
  cnt int
)

insert into purch select t2.product, sum(t1.cnt) purchase
from operations_data t1
  join product t2 on t1.product_id = t2.product_id
where t1.order_type_id = 1
  group by t2.product

insert into sales select t2.product, sum(t1.cnt) sales
from operations_data t1
  join product t2 on t1.product_id = t2.product_id
where t1.order_type_id = 2
  group by t2.product

select product 'Наименование товара', cnt 'Количество на складе' from purch 
  except
select product 'Наименование товара', cnt 'Количество на складе' from sales
  
  
select v1.product 'Наименование товара', (v1.cnt - v2.cnt) 'Количество на складе' 
  from purch v1
  left join sales v2 on v1.product = v2.product
В итоге, я получаю все стоки, но в последней, вместо количества получаю null и никак не могу понять, как мне сделать чтобы там отобразилось количество непроданного товара
Наименование товара	Количество на складе
uniflott	                2200

Наименование товара	          Количество на складе
epoxy grouts	                            0
everal aqua 10	                            0
everal aqua 10 interior	                    0
everal aqua 40	                            0
fugen	                                    0
glue cm 11	                            0
glue cm 17	                            0
grout	                                    0
helmi 10	                            0
helmi 30	                            0
helmi primer	                            0
kiva 10	                                    0
kiva 30	                                    0
kiva 70	                                    0
partial fill cavity slab 100	            0
partial fill cavity slab 50	            0
partial fill cavity slab 80	            2
polyurethane foam	                    0
polyurethane foam premium of winter	    0
rockclose insulated dpc 20	            0
rotband	                                    0
uniflott	                          null
Для товара uniflott должно быть количество 2200

[Обновления: Tue, 24 June 2025 11:29]

Известить модератора

Re: Найти разницу между поступлением и реализацией в таблице [сообщение #6127 является ответом на сообщение #6126] Tue, 24 June 2025 15:30 Переход к предыдущему сообщению
mrtoad в настоящее время не в онлайне  mrtoad
Сообщений: 2
Зарегистрирован: June 2025
Junior Member
Разобрался, использовал функцию ISNULL, в результате запрос получился такой:
select v1.product 'Наименование товара', 
  (v1.cnt - isnull(v2.cnt,0)) 'Количество на складе' 
  from purch v1
  left join sales v2 on v1.product = v2.product
where (v1.cnt - isnull(v2.cnt,0)) != 0
Предыдущая тема: Оповещение об изменениях в AlwaysOn
Переход к форуму:
  


Текущее время: Fri Jun 27 00:13:10 GMT+3 2025

Общее время, затраченное на создание страницы: 0.00682 секунд