Oracle中用LISTAGG拼接同列min、max值为单行报ORA-00937问题咨询
问题原因
你触发ORA-00937报错的核心原因有两点:
min()、max()属于聚合函数,你在查询中同时混用了聚合函数和开窗函数OVER(),但没有定义对应的GROUP BY分组规则,Oracle无法识别聚合计算的维度- 你的需求只需要拼接同分组下的最小、最大值,完全不需要用
LISTAGG,LISTAGG是用来将多行不同值拼接为字符串的函数,不符合你的使用场景 - 额外注意:你原SQL中字段名书写错误,表结构中字段为
gen_id,你写为了geng_id,执行时需要修正
解决方案
场景1:仅查询指定单个分组的结果(gen_id=1221、pos_id=1234)
直接用聚合函数拼接即可,执行后直接返回单行1.0 m - 4.9 m结果:
SELECT min(Value) || ' - ' || max(Value) AS range_value FROM TSS_Gen WHERE gen_id = 1221 AND pos_id = 1234;
如果需要按语言维度拆分分组,在WHERE条件中补充对应的Language过滤条件即可。
场景2:批量查询全表所有分组的范围结果
如果需要返回所有gen_id、pos_id、Language分组对应的范围值,用GROUP BY定义分组维度即可:
SELECT gen_id, pos_id, Language, min(Value) || ' - ' || max(Value) AS range_value FROM TSS_Gen GROUP BY gen_id, pos_id, Language;
补充说明
如果你的Value字段是数值类型,没有内置单位m,可以自行拼接单位,写法调整为:min(Value) || ' m - ' || max(Value) || ' m'
内容的提问来源于stack exchange,提问作者Sangathamilan Ravichandran
相关产品推荐
相关产品推荐

