首頁
編程語言
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) PRIMARY KEY CLUSTERED,
  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
  d0.TransactionID,
  d0.TransactionDateTime,
  d0.Amount,
  (SELECT SUM(d1.Amount)
   FROM dbo.BankAccount d1
   WHERE d1.TransactionDateTime <= d0.TransactionDateTime
     AND d1.AccountNumber = d0.AccountNumber  -- 多帳戶時必加
  ) AS Balance
FROM dbo.BankAccount d0
ORDER BY d0.TransactionDateTime;

結果

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

兩大優勢

  1. 零儲存、即時計算:餘額不落地,查詢時即時聚合,帳戶數據量小則閃電快;大量時加上 TransactionDateTime 索引極佳。
  2. 可稽核、可回溯:每筆交易獨立可驗,異常時可精準定位導致餘額異常的單筆交易,符合金融稽核需求。

擴充應用

  • 多帳戶:加 AccountNumber 分組,子查詢加 AND d1.AccountNumber = d0.AccountNumber。
  • 存貨餘量:初始庫存 1000,後續出入庫正負相加,同樣邏輯。
  • 效能優化:大量資料改用 SUM() OVER (PARTITION BY Account ORDER BY DateTime ROWS UNBOUNDED PRECEDING) (SQL 2012+) 窗口函數,避免逐列子查詢掃描。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved