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

Posted

技术标签:

【中文标题】Oracle SQL - 使用 CASE WHEN 语句时 GROUP BY 无效【英文标题】:Oracle SQL - Invalid GROUP BY when using CASE WHEN statement 【发布时间】:2018-01-31 18:32:55 【问题描述】:

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

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

我的代码如下:

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:不是 GROUP BY 表达式 (#979)。

我试图去掉 CASE WHEN 语句,它工作正常。只有当我添加这些时我才会遇到问题。

任何帮助将不胜感激! :)

【问题讨论】:

谢谢@Vamsi Prabhala - 我去编辑我自己的错误,你在我之前修复了它! :) Repair_type 不在您的分组中。 【参考方案1】:

您需要在聚合中中使用 case 表达式,而不是反过来:

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

【讨论】:

这太棒了。非常感谢你向我解释。我知道我很接近。我很感激! 如果我想添加除“A”、“B”或“C”之外的第四个选项,如果是其他选项,该怎么做? 使用另一个聚合案例表达式,其中包含您需要的任何逻辑。

以上是关于Oracle SQL - 使用 CASE WHEN 语句时 GROUP BY 无效的主要内容,如果未能解决你的问题,请参考以下文章

CASE .. Oracle SQL 中的 WHEN 表达式

Oracle SQL 查询使用 case when,压缩空字段

case-when oracle sql的动态评估

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

Sql文的where中使用case when

oracle菜鸟学习之 select case when的使用