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

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

  • 相关阅读:
    POJ 1426 Find The Multiple(数论——中国同余定理)
    POJ 2253 Frogger(Dijkstra变形——最短路径最大权值)
    POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
    POJ 3278 Catch That Cow(模板——BFS)
    HDU 1071 The area
    HDU 1213 How Many Tables(模板——并查集)
    POJ 1611 The Suspects
    light oj 1214 Large Division
    POJ 1258 Agri-Net(Prim算法求解MST)
    POJ 2387 Til the Cows Come Home(模板——Dijkstra算法)
  • 原文地址:https://www.cnblogs.com/GreenLeaves/p/5833105.html
Copyright © 2011-2022 走看看