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
我正在尝试为我们在损坏自己设备的地方所做的工作增加维修时间(我知道……这太疯狂了)。
本质上,我希望能够查看零件的总维修时数,然后还可以查看通过不同类型的维修细分了多少小时。我的代码如下,我希望实现这样的目标:
我的代码如下:
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