Oracle SQL - 使用 CASE WHEN 语句时无效的 GROUP BY

Oracle SQL - Invalid GROUP BY when using CASE WHEN statement

我正在尝试为我们在损坏自己设备的地方所做的工作增加维修时间(我知道……这太疯狂了)。

本质上,我希望能够查看零件的总维修时数,然后还可以查看通过不同类型的维修细分了多少小时。我的代码如下,我希望实现这样的目标:

我的代码如下:

SELECT 
            PART_NUM,
            PART_NAME,
            PART_SERIAL_NUM,
            SUM(REPAIR_HOURS) AS "TOTAL_REPAIR_HOURS",
            CASE WHEN REPAIR_TYPE = 'A' THEN SUM(REPAIR_HOURS) END AS "CONCRETE_HOURS",
            CASE WHEN REPAIR_TYPE = 'B' THEN SUM(REPAIR_HOURS) END AS "DEMOLITION_HOURS",
            CASE WHEN REPAIR_TYPE = 'C' THEN SUM(REPAIR_HOURS) END AS "AUTOMOTIVE_HOURS"

        FROM 
            PARTS
                LEFT JOIN REPAIRS
                     ON PART_NUM = REPAIRED_PART AND 
                        PART_SERIAL_NUM = REPAIRED_PART_SERIAL_NUM

        WHERE
            PART_NUM = '500ABX'

        GROUP BY 
            PART_NUM,
            PART_NAME,
            PART_SERIAL_NUM

(我显然一次只测试一个部分:))

我不断收到错误消息

ORA-00979: not a GROUP BY expression (#979).

我尝试去掉 CASE WHEN 语句,效果很好。只有当我添加这些时我才遇到问题。

如有任何帮助,我们将不胜感激! :)

您需要 case 表达式 inside 聚合,而不是相反:

SELECT 
            PART_NUM,
            PART_NAME,
            PART_SERIAL_NUM,
            SUM(REPAIR_HOURS) AS "TOTAL_REPAIR_HOURS",
            SUM(CASE WHEN REPAIR_TYPE = 'A' THEN REPAIR_HOURS ELSE 0 END) AS "CONCRETE_HOURS",
            SUM(CASE WHEN REPAIR_TYPE = 'B' THEN REPAIR_HOURS ELSE 0 END) AS "DEMOLITION_HOURS",
            SUM(CASE WHEN REPAIR_TYPE = 'C' THEN REPAIR_HOURS ELSE 0 END) AS "AUTOMOTIVE_HOURS"

        FROM 
            PARTS
                LEFT JOIN REPAIRS
                     ON PART_NUM = REPAIRED_PART AND 
                        PART_SERIAL_NUM = REPAIRED_PART_SERIAL_NUM

        WHERE
            PART_NUM = '500ABX'

        GROUP BY 
            PART_NUM,
            PART_NAME,
            PART_SERIAL_NUM