SQL Server 2008 R2——用CTE进行递归计算求解累计值
2015-11-16 10:11
106 查看
=================================版权声明=================================
[b]版权声明:原创文章 谢绝转载
[/b]
请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我
勿用于学术性引用。
勿用于商业出版、商业印刷、商业引用以及其他商业用途。
本文不定期修正完善。
本文链接:/article/5266612.html
耻辱墙:/article/5266550.html
=======================================================================
话不多说 先上问题
![](http://images2015.cnblogs.com/blog/350642/201511/350642-20151116093927827-985785751.png)
鄙视垃圾爬虫网站 祝你们早生极乐
=======================================================================
乍看群友的叙述,是要想很多事情的,大概两分钟(虚词)后,就可以分析出
余额'=余额+借方-贷方
然而关键的一点是,1+0=1,1-0=1。此为小学知识。意思是加减零对运算结果不影响。
所以问题中需要进行判断的地方只有“方向”列。而“方向”列的计算依据是余额,所以只要先专心致志的求解出“余额”列就行了。
(此处省略了群友自己给出的分析,没有为什么。经常在群里回答问题的人都知道这其中的厉害。)
=======================================================================
承蒙园友ahdung在上一篇博文(传送门)里不吝赐教,此处王林森尝试着使用CTE的递归进行问题求解。
=======================================================================
下面贴上王林森的代码(附带测试数据)
鄙视垃圾爬虫网站 祝你们早生极乐
运行结果如下:
![](http://images2015.cnblogs.com/blog/350642/201511/350642-20151116132303327-1289076340.png)
鄙视垃圾爬虫网站 祝你们早生极乐
作为一只C++,我做SQL的宗旨是“不求高效,但求能跑”。
下面附上执行计划:
![](http://images2015.cnblogs.com/blog/350642/201511/350642-20151116095808733-1280671246.png)
鄙视垃圾爬虫网站 祝你们早生极乐
=======================================================================
![](http://images0.cnblogs.com/blog2015/350642/201507/021038220988024.png)
(友情支持请扫描这个)
微信扫描上方二维码捐赠
[b]版权声明:原创文章 谢绝转载
[/b]
请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我
勿用于学术性引用。
勿用于商业出版、商业印刷、商业引用以及其他商业用途。
本文不定期修正完善。
本文链接:/article/5266612.html
耻辱墙:/article/5266550.html
=======================================================================
话不多说 先上问题
![](http://images2015.cnblogs.com/blog/350642/201511/350642-20151116093927827-985785751.png)
鄙视垃圾爬虫网站 祝你们早生极乐
=======================================================================
乍看群友的叙述,是要想很多事情的,大概两分钟(虚词)后,就可以分析出
余额'=余额+借方-贷方
然而关键的一点是,1+0=1,1-0=1。此为小学知识。意思是加减零对运算结果不影响。
所以问题中需要进行判断的地方只有“方向”列。而“方向”列的计算依据是余额,所以只要先专心致志的求解出“余额”列就行了。
(此处省略了群友自己给出的分析,没有为什么。经常在群里回答问题的人都知道这其中的厉害。)
=======================================================================
承蒙园友ahdung在上一篇博文(传送门)里不吝赐教,此处王林森尝试着使用CTE的递归进行问题求解。
=======================================================================
下面贴上王林森的代码(附带测试数据)
----------------------------------------------------------- --网络代码有风险 --复制粘贴须谨慎 --wls 20151116 USE tempdb GO IF OBJECT_ID (N't_DCRbyWLS', N'U') IS NOT NULL DROP TABLE t_DCRbyWLS; GO CREATE TABLE t_DCRbyWLS(Debtor REAL,Creditor REAL,Direction NVARCHAR(1),Remainder REAL) GO INSERT INTO t_DCRbyWLS(Direction,Remainder) VALUES ('借',84.9000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (3000.000,0.0000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,800.0000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,2284.9000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (1144.0000,0.0000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,1144.0000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (5000.0000,0.0000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,5000.0000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (436.0000,0.0000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,436.0000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,4000.0000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (5000.0000,0.0000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,960.0000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,800.0000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (800.0000,0.0000) INSERT INTO t_DCRbyWLS(Debtor,Creditor) VALUES (0.0000,40.0000) GO SELECT * FROM t_DCRbyWLS GO WITH TempDCR AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS 'ID' ,Debtor,Creditor,Direction,Remainder FROM t_DCRbyWLS) , TempReCursion AS ( SELECT TOP 1 ID, Debtor,Creditor,Remainder,Direction FROM TempDCR UNION ALL 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 FROM TempDCR a JOIN TempReCursion b ON a.ID=b.ID+1 ) SELECT Debtor,Creditor,Direction,Remainder FROM TempReCursion
鄙视垃圾爬虫网站 祝你们早生极乐
运行结果如下:
![](http://images2015.cnblogs.com/blog/350642/201511/350642-20151116132303327-1289076340.png)
鄙视垃圾爬虫网站 祝你们早生极乐
作为一只C++,我做SQL的宗旨是“不求高效,但求能跑”。
下面附上执行计划:
![](http://images2015.cnblogs.com/blog/350642/201511/350642-20151116095808733-1280671246.png)
鄙视垃圾爬虫网站 祝你们早生极乐
=======================================================================
![](http://images0.cnblogs.com/blog2015/350642/201507/021038220988024.png)
(友情支持请扫描这个)
微信扫描上方二维码捐赠
相关文章推荐
- 数据库SQLServer增删改查及基本概念
- Oracle-EDB 修改表结构兼容性
- oracle数据库技巧
- MySQL关键字(保留字)列表
- 使用XtraBackup备份MariaDB
- 【转】mysql行列转换方法总结
- linux下redis安装
- mysql 数据插入优化方法
- navicat for mysql注册码
- oracle json 解析函数
- SQL中的cast()函数
- [转]oracle awr报告生成和分析
- MySQL字段类型详解
- 15天玩转redis —— 第二篇 基础的字符串类型
- 你真的会玩SQL吗?实用函数方汇总
- mysql安装图解
- MySql学习笔记----索引,外键
- configure: error: Cannot find libmysqlclient under /usr.
- 删除重复记录的SQL语句
- MySQL存储引擎--MyISAM与InnoDB区别