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,压缩空字段