首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 累計值查詢實戰:銀行帳戶餘額試算表生成

     編輯:關於SqlServer

場景:事件時間序列的累計計算

典型案例:銀行帳戶存/取款記錄,需在每筆交易後即時顯示當前餘額。

資料表結構

CREATE TABLE dbo.BankAccount (
    TransactionID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    TransactionDateTime DATETIME NOT NULL DEFAULT GETDATE(),
    Amount MONEY NOT NULL DEFAULT 0,          -- 正=存入,負=提領
    TransactionType CHAR(1) NOT NULL,         -- D/C 等業務標記
    AccountNumber VARCHAR(50) NULL
);

測試資料

TransactionIDTransactionDateTimeAmount
12006-11-03 02:33:42.34010000.00
22006-11-03 02:34:50.467-500.00
32006-11-03 02:35:04.857250.00
42006-11-03 02:42:19.763-124.25

累計餘額查詢(相關子查詢法)

SELECT
    TransactionID,
    TransactionDateTime,
    Amount,
    (SELECT SUM(Amount)
     FROM dbo.BankAccount AS D1
     WHERE D1.TransactionDateTime <= D0.TransactionDateTime) AS Balance
FROM dbo.BankAccount AS D0
ORDER BY TransactionDateTime;

結果

ID時間金額餘額
102:33:4210000.0010000.00
202:34:50-500.009500.00
302:35:04250.009750.00
402:42:19-124.259625.75

擴展應用

  • 多帳戶:加入 AccountNumber 欄位與 WHERE AccountNumber = @AcctNo 謂詞
  • 庫存試算:初始庫存 1000,後續扣減領料/入庫單,同樣邏輯適用

兩大優勢

  1. 零儲存開銷:無需物化餘額欄位,主鍵/外鍵索引下查詢極快
  2. 可追溯稽核:逐筆交易可檢視,異常交易即時定位隔離

效能提示

  • 大資料量時考慮改寫為 SUM() OVER (ORDER BY TransactionDateTime ROWS UNBOUNDED PRECEDING)(SQL Server 2012+ 視窗函數)
  • 確保 TransactionDateTime 有索引支援範圍掃描
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved