原始查詢:
with Tr As (
SELECT
DocDtls.Warehouse,
Transactions.Code,
DocDtls.zDate,
Transactions.ID,
Transactions.QtyIn,
Transactions.QtyOut,
Transactions.BalanceAfter
FROM
DocDtls
INNER JOIN Transactions ON DocDtls.[PrimDocNum] = Transactions.[DocNum]
),
formatted_tr as (
select
ID,
Code,
QtyIn,
QtyOut,
BalanceAfter,
LAG(BalanceAfter, 1, 0) Over (
partition by Warehouse,
Code
order by
Code,zDate,ID
) Prev_BlncAfter
from
Tr
)
select ID,Code,QtyIn,QtyOut,BalanceAfter
,SUM(Prev_BlncAfter QtyIn)-QtyOut As NewBlncAfter
from formatted_tr
group by ID,Code,QtyIn,QtyOut,BalanceAfter;
;
解釋這個想法:假設查詢回傳 Item 的所有事務X并且有 10 行作為結果,我需要遍歷所有 10 行和 SET BalanceAfter(對于第一個事務QtyIn- QtyOut,任何其他事務(PreviousBalanceAfter QtyIn)- QtyOut)等等。
我已經嘗試過:我嘗試將查詢結果放入 aDatatable然后再過濾一次,以DataView獲取當前行 ID 的唯一值,因此只有一行并將其保存在變數中 - 到目前為止運行良好 - 當我嘗試遍歷我的所有行并更新 BalanceAfter 我得到:NewBlncAfterDataGridViewDataviewDataGridview
必須宣告標量變數@Newblnc
你可以在這里找到整個代碼:

我使用舊查詢來比較結果,每一行都BalanceAfter應該相等NewBlncAfter。
編輯#2:使用SUM而不是LAG導致錯誤計算,如果我多次使用查詢,則結果BalanceAfter相乘
ID Code QtyIn QtyOut BalanceAfter
9 100001 20000 0 20000
14 100001 0 6000 40000
21 100001 3500 0 60000
24 100001 0 3000 80000
主要思想和期望的結果,例如:
ID Code QtyIn QtyOut BalanceAfter
9 100001 20000 0 20000
14 100001 0 6000 14000
21 100001 3500 0 17500
24 100001 0 3000 14500
公式為:對于第一筆交易QtyIn- QtyOut,任何其他交易(PreviousBalanceAfter QtyIn)- QtyOut,以此類推。
uj5u.com熱心網友回復:
首先,我認為完全沒有理由將所有這些資料提取到 C# 中,然后逐行更新(這是非常低效的)。您可以在單個批量更新中執行此操作。
目前尚不清楚您想要什么結果,但似乎您只想分配一個運行SUM計算,而不是LAG.
此外:
- 第二個 CTE 是不必要的,可以折疊成第一個。
- 在 an 中按同一列進行磁區和排序是
OVER沒有意義的。 - 最后
GROUP BY也沒有意義,似乎沒有必要,因為您是按主鍵分組的。
WITH Tr AS (
SELECT
d.Warehouse,
t.Code,
d.zDate,
t.ID,
t.QtyIn,
t.QtyOut,
t.BalanceAfter,
SUM(t.QtyIn - t.QtyOut) OVER (
PARTITION BY d.Warehouse, t.Code
ORDER BY d.zDate, t.ID
ROWS UNBOUNDED PRECEDING
) BlncAfter
FROM
DocDtls d
INNER JOIN Transactions t ON d.PrimDocNum = t.DocNum
WHERE t.Code = @VariableCode
)
UPDATE Tr
SET BalanceAfter = BlncAfter;
最后一點:為什么要將這些資訊存盤在一個新列中呢?為什么不只在需要時使用 計算它SUM OVER?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479622.html
上一篇:如何洗掉資料庫表中的資料
