zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    Eclipse下搭建Django环境
    在pycharm中启动Django服务器
    Window10安装Django,并创建第一个Django项目
    windows10安装tensorflow CPU版本
    service中显示一个dialog
    xp局域网共享访问没权限处理
    java线程调度
    Java优雅停机
    jit编译原理
    java final思考
  • 原文地址:https://www.cnblogs.com/GreenLeaves/p/5833105.html
Copyright © 2011-2022 走看看