Oracle SQL:别名列与分组求和问题及子查询尝试
搞定Oracle SQL里别名列+聚合函数的分组难题
嘿,我懂你遇到的这个头疼问题——在Oracle里定义了别名列m,又要用到sum()聚合函数,顶层直接按m分组肯定报错,毕竟GROUP BY的执行顺序在SELECT之前,这时候m还没被定义呢。你的思路完全找对了,嵌套子查询就是解决这类问题的标准操作,我来帮你把这个查询补全并理清楚关键点:
首先,你目前写的半完成查询是这样的:
select jobno,m,total from ( select j.jobno, sum(r.amtfc) total, decode(j.consolno,null,j.shpno,j.consolno) m from job j, jobother jo, revenue r, fmparty f where j.voidby is null and j.un...
要让它正常运行,核心是在子查询里把分组逻辑处理到位,因为聚合函数sum()需要明确的分组依据。具体来说,你需要在子查询的GROUP BY子句里包含jobno和生成m的完整decode表达式(Oracle不允许在GROUP BY里直接用列别名,除非是12c+的特定设置,所以写完整表达式更稳妥)。另外,建议把旧式的逗号表连接改成显式JOIN,可读性和维护性都更好。
修正后的完整查询大概是这样的:
select jobno, m, total from ( select j.jobno, decode(j.consolno, null, j.shpno, j.consolno) as m, sum(r.amtfc) as total from job j -- 这里补充你的表连接条件,比如j.jobno = jo.jobno这类关联逻辑 join jobother jo on j.jobno = jo.jobno join revenue r on j.jobno = r.jobno join fmparty f on j.party_id = f.party_id where j.voidby is null -- 把你没写完的WHERE条件补在这里 and j.un... -- 分组依据要包含所有非聚合的字段,也就是jobno和m的生成表达式 group by j.jobno, decode(j.consolno, null, j.shpno, j.consolno) ) sub;
简单解释下为什么这么写:
- 子查询里先计算出
m的值,同时按jobno和m的逻辑分组,算出每个分组对应的sum(r.amtfc)作为total - 外层查询直接从子查询里拿已经处理好的
jobno、m和total,这时候m已经是一个确定的列,完全可以直接引用 - 显式JOIN能让你更清晰地看到表之间的关联关系,避免不小心写出笛卡尔积
这样改完之后,你就能同时保留m列,又正常使用聚合函数啦。
内容的提问来源于stack exchange,提问作者p.yee
相关产品推荐
相关产品推荐

