我有一個流水表要插入多條記錄
假設用戶余額為 1000
多條記錄是另一個表中得出來的如A
A
ID(自增) 金額
1 100
2 200
3 300
插入的表
ID(自增) 金額 余額
1 100 900
2 200 700
3 300 400
uj5u.com熱心網友回復:
IF OBJECT_ID(N'TEMPDB.DBO.#T') IS NOT NULL
DROP TABLE #T
GO
CREATE TABLE #T
(ID INT IDENTITY(1,1),
AMOUNT INT)
INSERT INTO #T
SELECT 100 UNION ALL
SELECT 200 UNION ALL
SELECT 300
GO
DECLARE @PAYMENT INT
SET @PAYMENT=1000
SELECT A.*,@PAYMENT-SUBTOTAL AS BALANCE FROM #T A
OUTER APPLY (SELECT SUM(AMOUNT) AS SUBTOTAL FROM #T WHERE ID<=A.ID) AS B
uj5u.com熱心網友回復:
上面這樣計算,資料量大,速度慢uj5u.com熱心網友回復:
2樓,有更好的方法嗎.uj5u.com熱心網友回復:
如果你這個用戶期初余額是不變的,那你就每次在表中插入新資料的時候,就把這個值也計算好并保存進去,以后查的時候就不用實時計算了。uj5u.com熱心網友回復:
你的需求是插入新記錄時自動算出余額,但是余額不是批量能算出來的,而是依據上一條的結果來計算。這種需求實際上違反資料庫“行順序無關緊要”原則和“行資料相互獨立”原則,所以原生的 SQL 陳述句并不支持這種計算。貌似除了使用游標,或使用類似1#的回復,沒有其他方法了,本質都是在記錄上做回圈且不可并行,所以速度不可能快。uj5u.com熱心網友回復:
沒看到你本身就是要插入新資料的時候進行計算,如果是這樣,那確實如#5說的那樣。
uj5u.com熱心網友回復:
--sql2012+
IF OBJECT_ID(N'TEMPDB.DBO.#T') IS NOT NULL
DROP TABLE #T
GO
CREATE TABLE #T
(ID INT IDENTITY(1,1),
AMOUNT INT)
INSERT INTO #T
SELECT 100 UNION ALL
SELECT 200 UNION ALL
SELECT 300
GO
DECLARE @PAYMENT INT
SET @PAYMENT=1000
SELECT *,@PAYMENT-SUM(AMOUNT) OVER(ORDER BY ID) AS 余額 FROM #T
uj5u.com熱心網友回復:
也可以用cte,用遞回按順序補充上余額,但需要保證行資料不會被篡改和洗掉另外,也不是每次都需要計算全表資料的,已經有資料的,只取最后一行有余額的行作為依據即可
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/8409.html
標籤:基礎類
