在CASE语句中计算适当的费率

时间:2015-04-26 22:03:32

标签: sql sql-server sql-server-2008


    Existing Tables:

    Projects
    - projectID
    - name
    - rate

    Shifts
    - shiftID (PK)
    - projectID (FK)
    - name
    - startTime
    - rate

    [Shifts]
    ID  projectID   userID  shift     startTime                 baseRate    addition
    1   1           1       Shift A   1900-01-01 08:00:00.000   15.00       10%
    1   1           1       Shift B   1900-01-01 17:00:00.000   15.00       2

    [Projects]
    ID  project     rate
    1   Project A   10

逻辑:移位率由两个字段(基线+加法)组成,其中[加法]可以是百分比或固定金额。我有一个SELECT查询来确定需要应用的正确速率,但有一个错误:

当[加法]为固定金额时,基本费率会增加而不是添加


    SELECT CASE WHEN ISNULL(s.rate,0) = 0 THEN p.rate ELSE s.rate END * 
            CASE WHEN CHARINDEX('%',s.addition)>0 
                THEN (1+CAST(REPLACE(s.addition,'%','') AS FLOAT)/100) 
                ELSE 1+CAST(ISNULL(s.addition,0) AS FLOAT) 
            END
        AS finalRate
    FROM Projects p 
    INNER JOIN Shifts s ON p.ID = s.projectID

所以,我需要修改这一行** ELSE 1 + CAST(ISNULL(sw.addition,0)AS FLOAT)**

请注意,查询代码段是更大查询的一部分,因此无法进行太多更改。

1 个答案:

答案 0 :(得分:0)

变化:

ELSE 1+CAST(ISNULL(s.addition,0) AS FLOAT) 

为:

ELSE (CASE WHEN ISNULL(s.rate,0) = 0 THEN p.rate ELSE s.rate END + 
CAST(ISNULL(s.addition,0) AS FLOAT)) / CASE WHEN ISNULL(s.rate,0) = 0 THEN p.rate ELSE s.rate END

基于公式:

如果你有15作为率和2作为加法,你想得到17与乘法。那么,你应该乘以15来得到17?

15 * x = 15 + 2
x = (15 + 2) / 15

另一个选择是改变案例陈述的顺序:

SELECT  CASE WHEN CHARINDEX('%',s.addition)>0 
            THEN CASE WHEN ISNULL(s.rate,0) = 0 THEN p.rate ELSE s.rate END * (1+CAST(REPLACE(s.addition,'%','') AS FLOAT)/100) 
            ELSE CASE WHEN ISNULL(s.rate,0) = 0 THEN p.rate ELSE s.rate END + CAST(ISNULL(s.addition,0) AS FLOAT) 
        END
    AS finalRate
FROM Projects p 
INNER JOIN Shifts s ON p.ID = s.projectID