SQL - 使用Case,When对来自不同行的值求和

时间:2016-06-13 17:52:42

标签: mysql sql tsql case case-when

我正在尝试为报告中的项目找到人工和开销。通过操纵“因子”列和“速率”列中的数据找到“人工”和“间接费用”。这些因素和费率按不同类型分类。它比它需要的复杂得多,我的工作就是理解它。

以下是返回的数据片段,其中“成本列”未排序。 enter image description here

当Type = W10时,那么成本是基于人工的,当Type = WO1或WO2时,则成本是基于开销的。
 我的困境在于我必须将Type ='WO1,WO2'的值添加到一起以获得总开销成本。
我决定使用CASE / WHEN来尝试获取我需要的数据,但我无法弄清楚如何将Overhead的成本加在一起。

到目前为止我的代码是:

SELECT DISTINCT 'LABOR' = CASE 
WHEN TYPE = 'W10' THEN (FACTOR * RATE)
ELSE 0 
END, //This part is fine//
'OVERHEAD' = CASE 
WHEN TYPE = 'WO1, WO2' THEN SUM(FACTOR * RATE) 
ELSE 0
END,

FROM TABLE_1  

但是,当Type = WO1或WO2时,SUM(因子*速率)不是将两行Costs相加,它会像这样返回0:

enter image description here

我不知道我如何描述我的问题,但如果你们能帮助解决这个问题,那就太棒了。

2 个答案:

答案 0 :(得分:1)

尝试

when type IN ('W01','W02')

写作TYPE =' WO1,WO2'你正在寻找W01,W02'而不是其中之一。

因为上述陈述并不合适,根据申请人的说法,我补充说:

'OVERHEAD' = CASE 
WHEN TYPE = 'WO1' THEN SUM(FACTOR * RATE) 
WHEN TYPE = 'WO2' THEN SUM(FACTOR * RATE) 
ELSE 0
END,

答案 1 :(得分:1)

让我们创建一些示例数据并尝试

CREATE TABLE TABLE_1 (rate FLOAT, Factor FLOAT, costs FLOAT, Type VARCHAR(3))

INSERT INTO TABLE_1
VALUES (.225000, 33.00000, 7.4250000, 'W10')

INSERT INTO TABLE_1
VALUES (1.0000, 14.8500, 14.8500, 'W01')

INSERT INTO TABLE_1
VALUES (1.0000, 1.1666, 1.16660000, 'W02')

我希望我只添加了第一个项目A 如果我理解问题,则问题存在于GROUP BY子句中。 如果我重新编写如下代码并在计算之前将W01和W02分组在一起,您将获得所需的结果。

SELECT CASE 
        WHEN [TYPE] = 'A'
            THEN SUM(N)
        ELSE 0
        END AS labour
    ,CASE 
        WHEN [TYPE] IN ('B')
            THEN SUM(N)
        ELSE 0
        END AS overhead
FROM (
    SELECT rate * factor AS n
        ,CASE 
            WHEN type = 'W10'
                THEN 'A'
            WHEN type IN ('W01', 'W02')
                THEN 'B'
            ELSE ''
            END AS type
    FROM table_1
    ) AS t
GROUP BY [type] 

我希望这是你想要的结果,如果不是,请发布DDL和一些带有所需输出的样本数据。