不用循环游标,一句update代码实现滚动计算

发现一段经典SQL,不用循环游标,一句update代码实现滚动计算结存。为方便理解,结合实例测试之

--1,源数据#t1,jcshl初值为每个sid的当前库存数量
--要实现的效果:每个sid当前行结存数量等于前一行结存数量jcshl减去当前行出库数量chkshl

--CREATE TABLE #t1 (
--	sn INT NOT NULL,
--	sid CHAR(5),
--	chkshl DECIMAL(18,4),
--	jcshl DECIMAL(18,4),
--	plh INT
--)

SELECT * FROM #t1 ORDER BY sn
sn sid chkshl jcshl plh
1 S0002 20.0000 980.0000
2 S0003 10.0000 1010.0000
3 S0003 10.0000 1010.0000
4 S0003 10.0000 1010.0000
5 S0002 10.0000 980.0000
6 S0002 1.0000 980.0000
7 S0004 20.0000 720.0000
8 S0005 10.0000 530.0000
9 S0005 10.0000 530.0000
10 S0005 10.0000 530.0000
11 S0004 10.0000 720.0000
12 S0004 1.0000 720.0000
--2,按sid排序#t2,数据顺序决定分组及计算顺序

SELECT * INTO #t2 FROM #t1 ORDER BY sid,sn
sn sid chkshl jcshl plh
1 S0002 20.0000 980.0000
5 S0002 10.0000 980.0000
6 S0002 1.0000 980.0000
2 S0003 10.0000 1010.0000
3 S0003 10.0000 1010.0000
4 S0003 10.0000 1010.0000
7 S0004 20.0000 720.0000
11 S0004 10.0000 720.0000
12 S0004 1.0000 720.0000
8 S0005 10.0000 530.0000
9 S0005 10.0000 530.0000
10 S0005 10.0000 530.0000
--3,滚动更新jcshl结存数量,同时填入新的plh排列号

DECLARE @plh int,@jcshl DECIMAL(18,4),@sid CHAR(5)

UPDATE #t2 SET 
    @jcshl=jcshl=CASE WHEN sid=@sid THEN @jcshl-chkshl ELSE jcshl-chkshl END,
    @plh=plh=ISNULL(@plh,0)+1,
    @sid=sid=sid

SELECT * FROM #t2
sn sid chkshl jcshl plh
1 S0002 20.0000 960.0000 1
5 S0002 10.0000 950.0000 2
6 S0002 1.0000 949.0000 3
2 S0003 10.0000 1000.0000 4
3 S0003 10.0000 990.0000 5
4 S0003 10.0000 980.0000 6
7 S0004 20.0000 700.0000 7
11 S0004 10.0000 690.0000 8
12 S0004 1.0000 689.0000 9
8 S0005 10.0000 520.0000 10
9 S0005 10.0000 510.0000 11
10 S0005 10.0000 500.0000 12
posted @   hhlotus  阅读(578)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示