我正在使用 SQL Server 2014。我有一個查詢,它回傳將消耗組件(具有所需數量 ReQ)和特定日期 (Req Dt) 的作業訂單串列。我將此串列加入了一個庫存表,該表提供了每個組件、當前可用庫存和已預留數量的總數。作業訂單所需數量尚未預留/確認,因此未在庫存表中考慮。該串列按組件編號和需要日期排序。
對于每個線消耗的相同組分,我要添加計算所述預計凈股票colunm(NST,其余成分量),并且因此確定未來缺少的組件(當投影凈庫存為0或下面)。
回圈到串列中,對于每個組件,計算規則是:
- 對于第一行(出現第一個組件):當前行的凈庫存 =(可用庫存 - 預留數量 - 所需數量)。
- 對于第二行(出現第二個組件):凈庫存 = 第 1 行的凈庫存 - 第 2 行所需的數量
- 對于最后一行:凈庫存 N = 凈庫存 N-1 - 所需數量行 N
如果我使用 Excel,它看起來像: 在此處輸入影像描述
非常感謝您在此主題上的幫助。
感謝您對 Marc 和 Larnu 的關注。
我已經創建了獲取主要資料的 SQL 代碼;我需要修改查詢以添加 2 列:
- 計算預計凈存量 (NST)。
- 低剩余庫存 (LSt) 的屬性是/否,但我可以處理。
表結構主要基于以下列:
- Job_No=消耗所需數量(ReQ)的作業訂單
- Cmp=組件代碼
- Req Dt=需要日期
- ReQ=Qty required(需要的組件數量)
- AvSt=庫存表中的可用庫存
- ResQ=從庫存表中保留的總數量
- NSt=凈庫存(預計剩余庫存)
- LSt="如果凈庫存 >=0 則否,如果凈庫存 <0 則是”。
可用庫存和總預留數量是查詢運行時庫存表中的當前值。
對于每個組件,第一次出現提供初始凈庫存,然后用于計算下一次出現(行)的凈庫存。當發現新組件時,重新開始相同的計算程序。
我的難點是:
- 如何使用從前一行到當前行計算的凈庫存值。
- 每次在串列中發現新組件時如何重新啟動計算程序。
以下是一組資料,其中包含 NSt 和 LSt 的預期結果:
| 作業_否 | 比較 | 請求 | 請求 | AvSt | 回復 | NSt | LSt |
|---|---|---|---|---|---|---|---|
| 273908 | F000307 | 03/11/2021 | 1 | 1675 | 1102 | 572 | 不 |
| 273905 | F000307 | 03/11/2021 | 1 | 1675 | 1102 | 571 | 不 |
| 273910 | F000307 | 03/11/2021 | 1 | 1675 | 1102 | 570 | 不 |
| 273909 | F000307 | 03/11/2021 | 1 | 1675 | 1102 | 569 | 不 |
| 273874 | F000307 | 03/11/2021 | 1 | 1675 | 1102 | 568 | 不 |
| 273875 | F000307 | 03/11/2021 | 1 | 1675 | 1102 | 567 | 不 |
| 273876 | F000307 | 03/11/2021 | 1 | 1675 | 1102 | 566 | 不 |
| 273881 | F000307 | 03/11/2021 | 1 | 1675 | 1102 | 565 | 不 |
| 273882 | F000307 | 03/11/2021 | 1 | 1675 | 1102 | 564 | 不 |
| 273884 | F000307 | 10/11/2021 | 1 | 1675 | 1102 | 563 | 不 |
| 274135 | F000313 | 07/09/2021 | 4 | 41688 | 6 | 41678 | 不 |
| 274136 | F000313 | 20/09/2021 | 2 | 41688 | 6 | 41676 | 不 |
| 274202 | F000314 | 14/09/2021 | 10 | 188 | 158 | 20 | 不 |
| 274203 | F000314 | 14/09/2021 | 10 | 188 | 158 | 10 | 不 |
| 274205 | F000314 | 24/09/2021 | 10 | 188 | 158 | 0 | 不 |
| 274207 | F000314 | 27/09/2021 | 10 | 188 | 158 | -10 | 是的 |
| 274210 | F000314 | 27/09/2021 | 10 | 188 | 158 | -20 | 是的 |
| 274211 | F000314 | 12/10/2021 | 10 | 188 | 158 | -30 | 是的 |
| 274212 | F000314 | 21/10/2021 | 10 | 188 | 158 | -40 | 是的 |
| 274215 | F000314 | 21/10/2021 | 10 | 188 | 158 | -50 | 是的 |
| 274220 | F000314 | 25/10/2021 | 10 | 188 | 158 | -60 | 是的 |
| 274222 | F000314 | 25/10/2021 | 10 | 188 | 158 | -70 | 是的 |
| 274230 | F000314 | 25/10/2021 | 10 | 188 | 158 | -80 | 是的 |
| 274231 | F000314 | 26/10/2021 | 10 | 188 | 158 | -90 | 是的 |
--我的初始 SQL:
SELECT --A.[SCHN - Schedule number] 'Schedule'
A.[MFNO - Manufacturing order number] 'Job_No'
,A.[MTNO - Component number] 'Comp'
,A.[RDAT - Reservation date] 'Req dt'
,A.[REQT - Reserved quantity] 'ReQ'
,C.[STQT - On-hand balance approved] 'AvSt' -- from stock table
,C.[REQT - Reserved quantity] 'ResQ' -- from stock table
/** This is the first projected Net Stock for the first component occurence
but how to calculate the next occurence line with the previous line result? **/
,C.[STQT - On-hand balance approved]-C.[REQT - Reserved quantity]-A.[REQT - Reserved quantity] as 'NSt'
,case when (C.[STQT - On-hand balance approved]-C.[REQT - Reserved quantity]-A.[REQT - Reserved quantity])<=0 then 'Yes'
else 'No' end as 'LSt'
/* (C.[STQT - On-hand balance approved]-C.[REQT - Reserved quantity]-A.[REQT - Reserved quantity])
will be replaced by the new projected Net Stock when available*/
,A.[RGDT - Entry date]
FROM [JOB ORDERS] A
left join [WAREHOUSE STOCK] C
On A.[MTNO - Component number]=C.[ITNO - Item number] and A.[WHLO - Warehouse]=C.[WHLO - Warehouse]
where A.[WMST - Material status]<='44'
and A.[SCHN - Schedule number]<>0
and A.[RGDT - Entry date]>20210101
and A.[REQT - Reserved quantity]>0
order by A.[MTNO - Component number] ,A.[RDAT - Reservation date]
uj5u.com熱心網友回復:
您可以SUM用作視窗函式。
- 請注意使用
ROWS UNBOUNDED PRECEDING, 如果ORDER BY是不確定的,這是必要的,并且在任何情況下都更有效 - 使用有意義的表別名,
ABC并沒有真正幫助理解 - 良好的空白格式是必不可少的
- 用
[]not參考列名'' - 我強烈建議您將列命名為更短的名稱,而不需要首先參考
- 日期常量應該用引號引起來
SELECT
--jo.[SCHN - Schedule number] [Schedule]
jo.[MFNO - Manufacturing order number] [Job_No]
,jo.[MTNO - Component number] [Comp]
,jo.[RDAT - Reservation date] [Req dt]
,jo.[REQT - Reserved quantity] [ReQ]
,ws.[STQT - On-hand balance approved] [AvSt] -- from stock table
,ws.[REQT - Reserved quantity] [ResQ] -- from stock table
,SUM(ws.[STQT - On-hand balance approved] - ws.[REQT - Reserved quantity] - jo.[REQT - Reserved quantity])
OVER (PARTITION BY jo.[MTNO - Component number], jo.[WHLO - Warehouse]
ORDER BY jo.[RDAT - Reservation date] ROWS UNBOUNDED PRECEDING
) as [NSt]
,case when (ws.[STQT - On-hand balance approved] - ws.[REQT - Reserved quantity] - jo.[REQT - Reserved quantity]) <= 0
then 'Yes'
else 'No' end as [LSt]
,jo.[RGDT - Entry date]
FROM [JOB ORDERS] jo
left join [WAREHOUSE STOCK] ws
ON jo.[MTNO - Component number] = ws.[ITNO - Item number]
and jo.[WHLO - Warehouse] =ws.[WHLO - Warehouse]
where jo.[WMST - Material status] <= '44'
and jo.[SCHN - Schedule number] <> 0
and jo.[RGDT - Entry date] > '20210101'
and jo.[REQT - Reserved quantity] > 0
order by
jo.[MTNO - Component number],
jo.[RDAT - Reservation date];
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/365402.html
標籤:sql-server
下一篇:每小時運行一次cron作業
