插入多条记录,其中一个字段要得出结余

weixin_43998691 2020-08-16 09:07:41
我有一个流水表要插入多条记录
假设用户余额为 1000
多条记录是另一个表中得出来的如A
A
ID(自增) 金额
1 100
2 200
3 300

插入的表
ID(自增) 金额 余额
1 100 900
2 200 700
3 300 400
...全文
156 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
文盲老顾 2020-09-11
  • 打赏
  • 举报
回复
也可以用cte,用递归按顺序补充上余额,但需要保证行数据不会被篡改和删除 另外,也不是每次都需要计算全表数据的,已经有数据的,只取最后一行有余额的行作为依据即可
雨夹雪 2020-09-11
  • 打赏
  • 举报
回复

--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
RINK_1 2020-09-09
  • 打赏
  • 举报
回复
引用 4 楼 RINK_1 的回复:
如果你这个用户期初余额是不变的,那你就每次在表中插入新数据的时候,就把这个值也计算好并保存进去,以后查的时候就不用实时计算了。
没看到你本身就是要插入新数据的时候进行计算,如果是这样,那确实如#5说的那样。
datafansbj 2020-09-09
  • 打赏
  • 举报
回复
你的需求是插入新记录时自动算出余额,但是余额不是批量能算出来的,而是依据上一条的结果来计算。这种需求实际上违反数据库“行顺序无关紧要”原则和“行数据相互独立”原则,所以原生的 SQL 语句并不支持这种计算。貌似除了使用游标,或使用类似1#的回复,没有其他方法了,本质都是在记录上做循环且不可并行,所以速度不可能快。
RINK_1 2020-09-09
  • 打赏
  • 举报
回复
如果你这个用户期初余额是不变的,那你就每次在表中插入新数据的时候,就把这个值也计算好并保存进去,以后查的时候就不用实时计算了。
weixin_43998691 2020-09-09
  • 打赏
  • 举报
回复
2楼,有更好的方法吗.
xiaoxiangqing 2020-08-17
  • 打赏
  • 举报
回复
上面这样计算,数据量大,速度慢
RINK_1 2020-08-16
  • 打赏
  • 举报
回复

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

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧