问题:
第1天给丈母娘1分钱,第2天给2分钱,第3天给4分钱,以此类推,每天给前一天的2倍,给一个月(按30天)算就行。
问:第30天给多少钱,总共给多少钱?

解决方案:
1)while循环方法(不推荐)
一般思维可能就会定义一些变量,然后通过while进行循环,脚本会比较繁琐。这种方法大部分人都能想到,即使是数据库编程初学者,而博主本人也是比较反感while循环这种传统古老落后的编程习惯。这里就不对while循环实现做具体范例和介绍,以免误导大家。
2)CTE公用表达式递归方式(推荐
前面博主已经给大家介绍了怎么应用CTE递归方式编写简洁脚本来生成连续数字或日期(详细见博文:sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期),今天博主就继续为大家介绍通过CTE递归方式实现计算1分钱翻倍1个月(即:1分钱连续1个月每天翻1倍)的问题。

脚本:

/*
    作者:zhang502219048
    脚本来源:https://www.cnblogs.com/zhang502219048/p/11273639.html
    功能:通过CTE递归方式实现计算1分钱翻倍1个月的问题
    字段说明:Day为第几天,Money为当天多少钱,MoneyTotal为截止到Day当天累计多少钱
*/

with cte_table(Day, Money, MoneyTotal) as
(
    select 1, cast(0.01 as decimal(18,2)), cast(0.01 as decimal(18,2))
    union all
    select Day + 1, cast(Money * 2 as decimal(18,2)), cast(MoneyTotal + Money * 2 as decimal(18,2))
    from cte_table
    where Day < 30
)
select * from cte_table

脚本运行结果:

把运行结果的Money列(对应Excel的A列)和MoneyTotal列(对应Excel的B列)在Excel里面进行数据结果验证:

问题结论:
第30天给5,368,709.12元(五百多万)!总共给10,737,418.23元(一千多万)!

总结:
博主在这里就为大家分享了自己所编写的CTE递归脚本,各位朋友可以体会一下这种方式的编程思路和风格,在遇到类似问题的时候可以触类旁通,模仿本方法写出高质量精简脚本实现功能。转载请注明博文来源:https://www.cnblogs.com/zhang502219048/p/11225240.html

posted on 2019-07-31 20:25 张工502219048 阅读(...) 评论(...) 编辑 收藏