你的位置:首页 > 数据库

[数据库]SQL Server 2008 R2——用CTE进行递归计算求解累计值


=================================版权声明=================================

版权声明:原创文章 谢绝转载 

请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我

勿用于学术性引用。

勿用于商业出版、商业印刷、商业引用以及其他商业用途。                   

 

本文不定期修正完善。

本文链接:http://www.cnblogs.com/wlsandwho/p/4968075.html

耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html

=======================================================================

话不多说 先上问题

鄙视垃圾爬虫网站 祝你们早生极乐

=======================================================================

乍看群友的叙述,是要想很多事情的,大概两分钟(虚词)后,就可以分析出

余额'=余额+借方-贷方

然而关键的一点是,1+0=1,1-0=1。此为小学知识。意思是加减零对运算结果不影响。

所以问题中需要进行判断的地方只有“方向”列。而“方向”列的计算依据是余额,所以只要先专心致志的求解出“余额”列就行了。

(此处省略了群友自己给出的分析,没有为什么。经常在群里回答问题的人都知道这其中的厉害。)

=======================================================================

承蒙园友ahdung在上一篇博文(传送门)的里不吝赐教,此处王林森尝试着使用CTE的递归进行问题求解。

=======================================================================

下面贴上王林森的代码(附带测试数据)

 1 ----------------------------------------------------------- 2 --网络代码有风险 3 --复制粘贴须谨慎 4 --wls 20151116 5 USE tempdb 6 GO 7  8 IF OBJECT_ID (N't_DCRbyWLS', N'U') IS NOT NULL 9 DROP TABLE t_DCRbyWLS;10 GO11 12 CREATE TABLE t_DCRbyWLS(Debtor REAL,Creditor REAL,Direction NVARCHAR(1),Remainder REAL)13 GO14 15 INSERT INTO t_DCRbyWLS(Direction,Remainder) VALUES ('借',84.9000)16 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (3000.000,0.0000)17 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,800.0000)18 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,2284.9000)19 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (1144.0000,0.0000)20 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,1144.0000)21 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (5000.0000,0.0000)22 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,5000.0000)23 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (436.0000,0.0000)24 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,436.0000)25 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,4000.0000)26 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (5000.0000,0.0000)27 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,960.0000)28 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,800.0000)29 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (800.0000,0.0000)30 INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,40.0000)31 GO32 33 SELECT * FROM t_DCRbyWLS34 GO35 36 WITH TempDCR37 AS38 (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS 'ID' ,Debtor,Creditor,Direction,Remainder FROM t_DCRbyWLS)39 , 40 TempReCursion41 AS42 (43 SELECT TOP 1 ID, Debtor,Creditor,Remainder,Direction FROM TempDCR44 UNION ALL45 SELECT a.ID,a.Debtor,a.Creditor,b.Remainder+a.Debtor-a.Creditor,Direction=CASE WHEN b.Remainder+a.Debtor-a.Creditor>=0 THEN N'借' ELSE N'贷' END 46   FROM TempDCR a JOIN TempReCursion b ON a.ID=b.ID+147 )48 SELECT Debtor,Creditor,Direction,Remainder FROM TempReCursion

鄙视垃圾爬虫网站 祝你们早生极乐

作为一只C++,我做SQL的宗旨是“不求高效,但求能跑”。

下面附上执行计划

鄙视垃圾爬虫网站 祝你们早生极乐

=======================================================================

一个小QQ群

江西旅游地图线路大全江西旅游多少钱江西旅游攻略大全江西旅游攻略自助游江西旅游报价价格基隆市旅游景点介绍 桂林骆驼山_七星公园骆驼山旅游景点介绍 中华民族文化村旅游景点介绍 明思克号航空母舰_明斯克号航母世界旅游景点介绍 狼图腾拍摄地 乌拉盖草原[二] 西安近代十大“城宝级”建筑人民剧院 去巴厘岛绝不能错过的那些消费场所[二] 除了钟鼓楼 西安近代十大“城宝级”建筑你造么 河源龙源温泉里面有什么温泉池? 清远清泉湾在哪?去那漂流好不好? 恩平锦江温泉在哪?水质如何? 惠州有什么土特产可以带回家乡的啊?? 广东桂山大峡谷漂流开放时间?广东河源桂山大峡谷漂流旅游攻略? 广东桂山大峡谷漂流怎么样?桂山大峡谷漂流一天游攻略? 广东桂山大峡谷漂流在哪里?桂山大峡谷漂流好玩么? 2015万绿谷漂流门票价格?河源万绿谷漂流什么时候结束? MAX9590ETU+ Datasheet MAX9590ETU+ Datasheet MAX4512CSE+ Datasheet MAX4512CSE+ Datasheet MAX9591ETU+ Datasheet MAX9591ETU+ Datasheet 南京康辉旅行社 南京康辉旅行社 南京康辉旅行社 香港大屿山 香港大屿山 香港大屿山 大理一日游 大理一日游 大理一日游