博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL练习之不反复执行相同的计算
阅读量:5810 次
发布时间:2019-06-18

本文共 1485 字,大约阅读时间需要 4 分钟。

下面是Demo所需要的代码:

CREATE TABLE Fee(Income decimal(10,1),overhead decimal(10,1))INSERT INTO Fee VALUES(1000,10)INSERT INTO Fee VALUES(1000,20)INSERT INTO Fee VALUES(1000,30)INSERT INTO Fee VALUES(1000,30)INSERT INTO Fee VALUES(1000,50)INSERT INTO Fee VALUES(1000,60)

现在有一个报表系统,需要根据Fee表获得以下数据

收入     管理费:(overhead/100)      余额:(收入减去管理费)     评估:余额的20%     管理:余额的10%      保留:余额的5%

简单分析发现,除了收入(Income字段)和超出(overhead字段),报表中其余给出的字段都是计算字段,需要根据Income字段和overhead字段字段得出,下面是解决代码:

SELECT Income,overhead,Income-(Income*(overhead/100)) ExtraFee,(Income-(Income*(overhead/100)))*0.2 Assess,(Income-(Income*(overhead/100)))*0.1 Manager,(Income-(Income*(overhead/100)))*0.05 RetainFROM Fee

ok,完成需求,但是我们发现Income-(Income*(overhead/100)余额重复使用了好几次,这是很不好的,因为这个代码变得非常的冗长。所以针对代码的复用性问题(DRY原则),我对代码进行了重构!

 

重构一、下面是重构之后的代码:

SELECT ExtraFees.*,ExtraFee*0.2 Assess,ExtraFee*0.1 Manager,ExtraFee*0.05 RetainFROM (SELECT Income,overhead,Income-(Income*(overhead/100)) ExtraFeeFROM Fee) ExtraFees

重构之后的代码,通过子查询,将收入、超出、余额字段放入到子查询当中(将这三个字段组成一个新的临时表),然后通过检索临时表的数据来达到去除重复计算余额的目地,同样的当一条SELECT语句中,相同的计算操作多的话,都可以将相同的计算放入子查询中(形成一个新表),然后对新表进行操作!

重构之后的代码相比如之前代码的有点如下:

(1)虽然代码长度两者差不多,代码重构之后的代码更容易理解

(2)代码维护性较强,当余额的计算方法发生改变,重构之后的代码跟容易修改

 

 

重构二、

第二种方法是将相同的计算和字段放入视图中,这也是一种解决办法,代码如下:

CREATE VIEW ExtraFees ASSELECT Income,overhead,Income-(Income*(overhead/100)) ExtraFeeFROM Fee
SELECT ExtraFees.*,ExtraFee*0.2 Assess,ExtraFee*0.1 Manager,ExtraFee*0.05 RetainFROM ExtraFees

如果采用视图的话,要注意合理的命名这些视图,增加视图的可维护性!

 

转载于:https://www.cnblogs.com/GreenLeaves/p/5833105.html

你可能感兴趣的文章
d3 v4实现饼状图,折线标注
查看>>
微软的云策略
查看>>
Valid Parentheses
查看>>
【ES6】数值的扩展
查看>>
性能测试之稳定性测试
查看>>
ES6的 Iterator 遍历器
查看>>
2019届高二(下)半期考试题(文科)
查看>>
【REDO】删除REDO LOG重做日志组后需要手工删除对应的日志文件(转)
查看>>
nginx 301跳转到带www域名方法rewrite(转)
查看>>
AIX 配置vncserver
查看>>
windows下Python 3.x图形图像处理库PIL的安装
查看>>
【IL】IL生成exe的方法
查看>>
network
查看>>
SettingsNotePad++
查看>>
centos7安装cacti-1.0
查看>>
3个概念,入门 Vue 组件开发
查看>>
没有JS的前端:体积更小、速度更快!
查看>>
数据指标/表现度量系统(Performance Measurement System)综述
查看>>
GitHub宣布推出Electron 1.0和Devtron,并将提供无限制的私有代码库
查看>>
Angular2, NativeScript 和 React Native比较[翻译]
查看>>