计算仪表平均寿命时出现not a group by expression错误求助
问题原因与解决方案
错误原因
你遇到的「not a group by expression」错误,核心问题有两个:
- GROUP BY规则冲突:在Oracle等严格遵循SQL标准的数据库中,SELECT子句里的非聚合列必须全部出现在GROUP BY列表中。你的原SQL里
mtr.MTRM_METER_CHANGE_DATE、mtr.MTRM_INSTALLATION_DATE既不是聚合函数结果,也没在GROUP BY里,触发了语法校验错误。 - 平均寿命计算逻辑错误:直接用单条记录的日期差除以总数量,得到的不是整体平均值,逻辑完全错误。
修正后的SQL代码
方案一:用AVG函数直接计算平均值(简洁版)
SELECT mfg.MMFG_MFGNAME AS MFGNAME, COUNT(CASE WHEN sz.MCS_ID = 1 THEN mtr.MTRM_SERIAL_NO END) AS count_size_1, ROUND(AVG(mtr.MTRM_METER_CHANGE_DATE - mtr.MTRM_INSTALLATION_DATE), 2) AS avg_life FROM m_meter mtr JOIN m_metermfg mfg ON mfg.MMFG_MFGCODE = mtr.MTRM_MANUFACTURE_CODE JOIN m_connection_size sz ON sz.MCS_ID = mtr.MTRM_METER_SIZE WHERE mtr.MTRM_METER_CHANGE_DATE IS NOT NULL AND mfg.MMFG_MFGNAME IN ('KRANTI') GROUP BY mfg.MMFG_MFGNAME;
方案二:手动求和再除以数量(直观版)
SELECT mfg.MMFG_MFGNAME AS MFGNAME, COUNT(CASE WHEN sz.MCS_ID = 1 THEN mtr.MTRM_SERIAL_NO END) AS count_size_1, COUNT(mtr.MTRM_SERIAL_NO) AS total_meters, ROUND( SUM(mtr.MTRM_METER_CHANGE_DATE - mtr.MTRM_INSTALLATION_DATE) / COUNT(mtr.MTRM_SERIAL_NO), 2 ) AS avg_life FROM m_meter mtr JOIN m_metermfg mfg ON mfg.MMFG_MFGCODE = mtr.MTRM_MANUFACTURE_CODE JOIN m_connection_size sz ON sz.MCS_ID = mtr.MTRM_METER_SIZE WHERE mtr.MTRM_METER_CHANGE_DATE IS NOT NULL AND mfg.MMFG_MFGNAME IN ('KRANTI') GROUP BY mfg.MMFG_MFGNAME;
修正说明
- 移除了原SQL中多余的
diff列:你的需求是计算平均寿命,不需要单独展示单台仪表的使用时长 - 用聚合函数重构平均寿命计算:通过
AVG()直接求日期差的平均值,或用SUM()除以COUNT(),两种方式结果一致且符合逻辑 - 规范列名:将原
count列重命名为count_size_1,避免与SQL关键字冲突 - 严格遵循GROUP BY规则:SELECT中所有非聚合列仅保留
mfg.MMFG_MFGNAME,并与GROUP BY列表保持一致,解决语法错误
内容的提问来源于stack exchange,提问作者Priyanka Awasare
相关产品推荐
相关产品推荐

