Oracle SQL LEVEL层级查询使用SUM聚合无输出问题咨询
问题根因
你当前语句替换sum后无返回的原因非常明确:
- 通过
connect by level生成的counter字段全部是正整数,当sum(a.amount)的计算结果包含小数、或者数值超过1000000时,where条件的等值匹配无法命中任何行,自然没有返回结果。 - 之前使用
count聚合时返回结果天然是正整数,只要数值落在1~1000000区间就可以匹配成功,所以能正常输出。
适配方案(符合Oracle HCM表值集规则)
你不需要生成数值序列做等值匹配,只要把聚合计算全部放在内层子查询即可,既规避了SELECT子句不能直接使用聚合函数的限制,又支持小数结果返回,改写后的语句如下:
select to_char(sum_amount) from (select sum(a.amount) as sum_amount from table a)
如果需要固定小数输出格式,可以调整to_char的参数,比如保留2位小数的写法:
select to_char(sum_amount, '999999999.99') from (select sum(a.amount) as sum_amount from table a)
这个方案相比原写法性能提升非常明显,不需要生成百万级临时序列,仅需要扫描一次业务表计算聚合结果即可。
内容的提问来源于stack exchange,提问作者quodsolis
相关产品推荐
相关产品推荐

