ORA-00937报错修复:含聚合函数的CASE语句分组问题
修复ORA-00937和ORA-00934错误的方案
错误原因分析
- ORA-00937:你的SQL中使用了
SUM聚合函数,但同时引用了ITM2.UNIT_OF_ISSUE、UOM2.CONVERSION_RATE等非聚合列,Oracle要求所有非聚合列必须出现在GROUP BY子句中,否则无法确定聚合计算的分组依据。 - ORA-00934:你尝试将包含
SUM的整个CASE表达式加入GROUP BY,但GROUP BY不允许包含聚合函数,只能使用原始列或基于原始列的非聚合表达式。
额外逻辑问题提醒
注意CASE的ELSE分支SUM(ITM2.PRIMARY_UOM_CODE):PRIMARY_UOM_CODE是单位编码(通常为字符串类型),对其使用SUM函数逻辑无效,建议替换为实际需要聚合的数值字段(比如IOQD.PRIMARY_TRANSACTION_QUANTITY)。
修正后的SQL示例
SELECT CASE WHEN ITM2.UNIT_OF_ISSUE IS NOT NULL THEN SUM(IOQD.PRIMARY_TRANSACTION_QUANTITY) / UOM2.CONVERSION_RATE -- 替换为合理的数值字段求和,此处示例用IOQD的主交易数量 ELSE SUM(IOQD.PRIMARY_TRANSACTION_QUANTITY) END AS ONHAND_QTY FROM EGP_SYSTEM_ITEMS ITM2 JOIN INV_ONHAND_QUANTITIES_DETAIL IOQD ON IOQD.INVENTORY_ITEM_ID = ITM2.INVENTORY_ITEM_ID AND IOQD.ORGANIZATION_ID = ITM2.ORGANIZATION_ID -- 使用LEFT JOIN保留UNIT_OF_ISSUE为空的记录,否则这类数据会被过滤 LEFT JOIN inv_uom_conversions UOM2 ON UOM2.INVENTORY_ITEM_ID = ITM2.INVENTORY_ITEM_ID AND UOM2.UOM_CODE = ITM2.UNIT_OF_ISSUE -- 将所有非聚合列加入GROUP BY GROUP BY ITM2.UNIT_OF_ISSUE, UOM2.CONVERSION_RATE
关键修正点
- 改用
JOIN语法替代旧式逗号连接,逻辑更清晰,同时用LEFT JOIN确保UNIT_OF_ISSUE为空的记录不会被过滤。 - 将CASE中用到的所有非聚合列(
ITM2.UNIT_OF_ISSUE、UOM2.CONVERSION_RATE)加入GROUP BY子句。 - 修正ELSE分支的无效聚合逻辑,替换为合理的数值字段。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

