【问题标题】:SQL - Summing values from different rows using Case, WhenSQL - 使用大小写从不同行求和值,当
【发布时间】:2016-06-13 17:52:41
【问题描述】:

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

这是一个未排序的成本列返回的数据的 sn-p。

当类型 = W10 时,成本是基于人工的,当类型 = 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(Factor * Rate) 不会将两行 Costs 相加,它返回 0,如下所示:

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

【问题讨论】:

  • 这是什么数据库?您同时拥有 mysqltsql (SQL Server) 标记。
  • @jabo13 没有 GROUP BY 的聚合函数?
  • @Bijujose 我没有将 Group By 添加到我的示例代码中,因为我认为手头的问题没有必要,但在 FROM TABLE_1 下方,我有 GROUP BY Rate、Factor、类型

标签: mysql sql tsql case case-when


【解决方案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,

【讨论】:

  • 这有助于摆脱 0 值,但来自 WO1 和 WO2 的数据仍然没有加在一起。
  • 查看我的新解决方案
【解决方案2】:

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

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')

我希望我只添加了第一个item 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 和一些带有所需输出的示例数据。

【讨论】:

    猜你喜欢
    • 2020-06-20
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    相关资源
    最近更新 更多