Попытка агрегировать количества по нескольким таблицам SQL

#sql #sql-server

#sql #sql-server

Вопрос:

Я создаю синхронизацию запасов, которая сравнивает количество продуктов из трех разных таблиц: EWM USOR DSOR

Математика, лежащая в основе синхронизации запасов, такова: EWM — (USOR DSOR) = Рассогласование Таблица EWM делит количества продуктов на разные типы хранилищ, в которых хранятся продукты, что требует агрегирования количеств перед использованием в конечном запросе, но я продолжаю получать неверную цифру после агрегирования количествитак, я думаю, что я делаю что-то не так, но, похоже, я не могу это заметить.

Вот мой код:

 --Table for EWM Data--
create table EWM(
Date_loaded date,
Sap_code bigint, 
Product_description varchar(100),
Location nvarchar(50),
Storage_type varchar(50),
Quantity int,
Sap_batch nvarchar(50),
Expiry_date date,
Stock_type varchar(50)
);

--Table for USOR Data--
create table USOR(
Date_Loaded date,
Sap_Code bigint,
Product_description varchar(100),
Pack nvarchar(50),
Cost_price decimal,
Trade_price decimal,
Stock int,
Location nvarchar(50),
);

--Table for DSOR--
create table DSOR(
Date_Loaded datetime,
Sap_code bigint,
Product_description varchar(100),
Bin_location nvarchar(50),
Location varchar(50),
Pack nvarchar(50),
Units int,
Total int,
);
 
--Table for difference between EWM and USOR DSOR--
create table Misalignment
(
Date_loaded date,
Sap_code bigint,
Product_description varchar(100),
Pack nvarchar(50),
Location nvarchar(50),
Total_difference int
) 
 --Inserting data in Misalingment using query from USOR, USOR_DSOR, EWM --
 WITH x AS (
    SELECT SAP_Code, Quantity 
    FROM EWM 
    GROUP BY SAP_Code, Quantity
)
insert into Misalignment(Date_Loaded, Sap_code, Product_description, Location, Total_difference)
 Select USOR.Date_Loaded, USOR.Sap_Code, USOR.Product_description,  USOR.Location, sum(x.Quantity - (USOR.stock    DSOR.Total))as Total_difference 

FROM x 
 INNER JOIN USOR ON x.SAP_Code = USOR.SAP_Code
 INNER JOIN DSOR ON x.SAP_Code = DSOR.SAP_Code
 group by USOR.Date_Loaded, USOR.Sap_Code, USOR.Product_description, USOR.Pack, USOR.Location

 select * from Misalignment
 where Total_difference > 0
 order by Total_difference
 desc
  

Я выполнил приведенный ниже запрос, чтобы протестировать свой код:

  select * from ewm
 where  Date_loaded = '2020-10-05' and Sap_code = 1002945
 select * from DSOR
 where Sap_code = 1002945  and Date_loaded= '2020-10-05'
 select * from Misalignment
 where Sap_code  = 1002945 and Date_loaded = '2020-10-05'
  

Это был результат:
введите описание изображения здесь

Фактический результат должен быть равен 0. Есть предложения?

Комментарии:

1. Без выборочных данных кому-то трудно дать определение мнения. Причина, однако, «проста»; потому что это то, для чего вычисляется выражение.

2. Привет — в вашем примере отсутствуют данные из USOR. Кроме того, не могли бы вы предоставить данные для всех 3 исходных таблиц в виде инструкций INSERT, а не изображений? Спасибо

3. @NickW, спасибо, что указали, что я забыл включить USOR. Не уловил этого. Извиняюсь, все еще новичок в SQL, можете ли вы пояснить, что вы подразумеваете под предоставлением данных для исходных таблиц в виде инструкций insert? Вы имеете в виду файлы, которые я загружаю для каждой таблицы?

4. Привет — если вы можете предоставить данные в формате, который кому-то легко загрузить в таблицу (вместо того, чтобы вводить вручную), то более вероятно, что они создадут свою собственную версию ваших таблиц и попробуют некоторые решения. В SQL Server щелкните правой кнопкой мыши на базе данных, Задачи> Генерировать сценарии. Выберите соответствующие таблицы, а затем нажмите кнопку «Дополнительно». Существует опция «Типы данных для сценария», поэтому выберите значение, включающее данные