PLSQL分组统计异常:查询返回全量汇总而非供应商单独汇总
问题原因及解决方法
你的查询返回全表汇总值的核心问题是:子查询没有与外部查询的供应商字段关联,两个子查询计算的是所有供应商的全局总和,而非当前行供应商的单独统计。另外原查询还存在两个细节问题:
- 第二个子查询的逻辑优先级错误:
AND优先级高于OR,原条件会被解析为STATE='CONFIRMED' OR (STATE='RELEASED' AND DELIVERY_DATE>=SYSDATE),这大概率不符合你的实际需求。 GROUP BY子句未包含SUPPLIER_NO,Oracle会因为SELECT字段不在分组中报错。
以下是两种可行的修正方案:
方案一:关联子查询
给内外表添加别名,在子查询中通过供应商字段关联,确保每个子查询只统计当前供应商的数据:
SELECT ( SELECT SUM(ORDER_QTY) FROM MY_TABLE t_inner WHERE t_inner.SUPPLIER = t_outer.SUPPLIER AND t_inner.DELIVERY_DATE BETWEEN TRUNC(SYSDATE, 'YEAR') AND TRUNC(SYSDATE) ) AS YTD, ( SELECT SUM(ORDER_QTY) FROM MY_TABLE t_inner WHERE t_inner.SUPPLIER = t_outer.SUPPLIER AND (STATE = 'CONFIRMED' OR STATE = 'RELEASED') AND DELIVERY_DATE >= SYSDATE ) AS OVERDUE, SUPPLIER, SUPPLIER_NO FROM MY_TABLE t_outer GROUP BY SUPPLIER, SUPPLIER_NO
方案二:条件聚合(推荐)
使用SUM(CASE ...)在一次表扫描中完成分组统计,性能更优:
SELECT SUM(CASE WHEN DELIVERY_DATE BETWEEN TRUNC(SYSDATE, 'YEAR') AND TRUNC(SYSDATE) THEN ORDER_QTY ELSE 0 END) AS YTD, SUM(CASE WHEN (STATE = 'CONFIRMED' OR STATE = 'RELEASED') AND DELIVERY_DATE >= SYSDATE THEN ORDER_QTY ELSE 0 END) AS OVERDUE, SUPPLIER, SUPPLIER_NO FROM MY_TABLE GROUP BY SUPPLIER, SUPPLIER_NO
内容的提问来源于stack exchange,提问作者kiskkisk
相关产品推荐
相关产品推荐

