#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 щелкните правой кнопкой мыши на базе данных, Задачи> Генерировать сценарии. Выберите соответствующие таблицы, а затем нажмите кнопку «Дополнительно». Существует опция «Типы данных для сценария», поэтому выберите значение, включающее данные