SQL练习之不反复执行相同的计算
时间:2022-04-24
本文章向大家介绍SQL练习之不反复执行相同的计算,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
下面是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 Retain
FROM Fee
ok,完成需求,但是我们发现Income-(Income*(overhead/100)余额重复使用了好几次,这是很不好的,因为这个代码变得非常的冗长。所以针对代码的复用性问题(DRY原则),我对代码进行了重构!
重构一、下面是重构之后的代码:
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)代码维护性较强,当余额的计算方法发生改变,重构之后的代码跟容易修改
重构二、
第二种方法是将相同的计算和字段放入视图中,这也是一种解决办法,代码如下:
CREATE VIEW ExtraFees AS
SELECT
Income,
overhead,
Income-(Income*(overhead/100)) ExtraFee
FROM Fee
SELECT
ExtraFees.*,
ExtraFee*0.2 Assess,
ExtraFee*0.1 Manager,
ExtraFee*0.05 Retain
FROM ExtraFees
如果采用视图的话,要注意合理的命名这些视图,增加视图的可维护性!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- shadow dom一个最简单的例子
- 程序员必读:Git提交信息和分支创建规范
- 使用brew cask安装minikube的各种错误和解决方法
- 编写高质量可维护的代码:一目了然的注释
- SAP Hybris - how to find corresponding cronjob for a given import
- Linux与Windows间文件互传之TFTP方式
- 假设检验在数据分析中的应用
- 【前端开发】文本阴影:如何使用text-shadow实现首字线索引效果?
- 9.25【前端开发】超链接伪类:如何在svg元素上使用超链接伪类?
- 竞赛比完,代码、模型怎么处理?Kaggle大神:别删,这都是宝藏
- 9.26【前端开发】背景属性:样式中背景色和背景图片样式如何使用?
- 9.27【前端开发】图片文件格式:常见的图片格式对比有何优劣以及如何使用Google的webp格式?
- 9.28【前端开发】文本属性:如何使用文本阴影等样式?
- 9.29【前端开发】超链接伪类:如何在svg元素上使用超链接伪类?
- Angular input控件的click事件表达式如何被转换成JavaScript函数