我有一個帶有名為 Balance 的表的 SQL Server 資料庫
桌子:
ID | 日期 | 在 | 出去 | 平衡 |
---|---|---|---|---|
3345312 | 2022-08-07 | 100 | 50 | 250 |
5435245 | 2022-08-06 | 50 | 50 | 200 |
4353451 | 2022-08-05 | 0 | 100 | 200 |
5762454 | 2022-08-04 | 20 | 100 | 300 |
7634523 | 2022-08-03 | 400 | 100 | 380 |
5623456 | 2022-08-02 | 100 | 20 | 80 |
4524354 | 2022-08-01 | 0 | 0 | 0 |
- Id = 唯一識別符號
- 日期 = 余額日期
- IN = IN 數量
- OUT = OUT 數量
- 余額 = 最后一天余額 入 - 出
Balance列的值始終應等于(Last Day Balance IN - OUT)
也就是說,如果在 2022-08-04 條目數從 20 更改為 100,則必須重新計算 2022-08-04 以后的余額:
ID | 日期 | 在 | 出去 | 平衡 |
---|---|---|---|---|
3345312 | 2022-08-07 | 100 | 50 | 330 |
5435245 | 2022-08-06 | 50 | 50 | 280 |
4353451 | 2022-08-05 | 0 | 100 | 280 |
5762454 | 2022-08-04 | 100 | 100 | 380 |
我試圖進行遞回查詢以更新此余額
它沒有用。它只是更新我更新的那天的余額,而忽略了接下來的幾天。
這是我到目前為止所做的:
DECLARE @BalanceDate DATE = '2022-09-04';
DECLARE @BalanceLastDay DECIMAL(19,5) = (SELECT TOP 1 COALESCE(Balance, 0)
Balances
WHERE BalanceDate < @BalanceDate
ORDER BY BalanceDate DESC);
WITH Inventory AS
(
SELECT Id, BalanceDate, IN, OUT, Balance,
LAG(Balance) OVER (ORDER BY BalanceDate) AS BalanceLastDay,
FROM Balances
WHERE BalanceDate >= @BalanceDate)
),
InventoryUpdated AS
(
SELECT inv.*,
(COALESCE(BalanceLastDay, @BalanceLastDay) IN - OUT) AS RealBalance,
FROM Inventory inv
)
UPDATE Balances SET Saldo = invUpdt.SaldoReal
FROM Balances INNER JOIN InventoryUpdated invUpdt on Balances.Id = invUpdt.Id
WHERE invUpdt.Saldo <> invUpdt.SaldoReal;
uj5u.com熱心網友回復:
您可以使用以下內容:
Select Id, [Date], [IN], [OUT],
SUM([IN] - [OUT]) Over (Order By [Date]) AS Balance
From your_table
Order By [Date] DESC;
SUM([IN] - [OUT]) Over (Order By [Date])
將計算(IN - OUT)隨著日期的增加而累積的總和。
注意:我認為將余額值存盤在表中不是一個好習慣,因為它是一個計算值,請參閱這篇文章。
但是,如果您想這樣做,您可以使用可更新的 CTE,如下所示:
With CTE AS
(
Select Id, Balance,
SUM([IN] - [OUT]) Over (Order By [Date]) AS bl
From your_table
)
Update CTE Set Balance = bl;
查看db<>fiddle的演示。
更新根據評論中所述的新要求,您在表中有多個產品,并且您希望從特定日期開始對特定產品執行更新。
要查找多個產品的運行/累積總和,您必須添加Partition By Pid
到Over
子句中,其中 Pid 是產品 ID,因此選擇查詢將是:
Select Pid, Id, [Date], [IN], [OUT],
SUM([IN] - [OUT]) Over (Partition By Pid Order By [Date]) AS Balance
From your_table
Order By Pid, [Date] DESC;
和更新查詢:
Update your_table Set [in] = 100 Where [Date] = '2022-08-04' And Pid = 1;
With CTE AS
(
Select Pid, Id, Balance, Date, [IN] ,[OUT],
SUM([IN] - [OUT]) Over (Partition By Pid Order By [Date]) AS bl
From your_table
)
Update CTE Set Balance = bl Where [Date] >= '2022-08-04' And Pid = 1;
查看演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507839.html
下一篇:C 模板函式遞回