前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL练习之不反复执行相同的计算

SQL练习之不反复执行相同的计算

作者头像
郑小超.
发布2018-01-24 15:25:15
7830
发布2018-01-24 15:25:15
举报
文章被收录于专栏:GreenLeaves

下面是Demo所需要的代码:

代码语言:javascript
复制
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字段字段得出,下面是解决代码:

代码语言:javascript
复制
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 Retain
FROM Fee

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

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

代码语言:javascript
复制
SELECT 
ExtraFees.*,
ExtraFee*0.2 Assess,
ExtraFee*0.1 Manager,
ExtraFee*0.05 Retain
FROM 
(SELECT 
Income,
overhead,
Income-(Income*(overhead/100)) ExtraFee
FROM Fee) ExtraFees

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

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

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

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

重构二、

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

代码语言:javascript
复制
CREATE VIEW ExtraFees AS
SELECT 
Income,
overhead,
Income-(Income*(overhead/100)) ExtraFee
FROM Fee
代码语言:javascript
复制
SELECT 
ExtraFees.*,
ExtraFee*0.2 Assess,
ExtraFee*0.1 Manager,
ExtraFee*0.05 Retain
FROM ExtraFees

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-09-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档