You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:42:05