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

Oracle SQL中如何基于另一列的distinct计数计算列平均值?

修正后的SQL查询及问题说明

原代码存在的问题

  1. 语法错误:括号匹配不当,COUNT(DISTINCT BILL_CYCLE) 未正确闭合;OVER() 子句位置错误,导致语法解析失败。
  2. 冗余操作:嵌套 SUM 写法冗余,且 1* 对计算无实际作用,可直接移除。
  3. 大小写不一致:列名 Bill_TYPE 与后续分组中的 BILL_TYPE 大小写不统一,可能引发匹配问题。
  4. 逻辑不规范:原代码试图计算全局总计除以全局唯一BILL_CYCLE数量,但写法不符合窗口函数的使用规范。

修正后的查询代码

SELECT
    "BILL_TYPE",
    "BILL_CYCLE",
    "NET_TOTAL",
    -- 分组内符合条件的MTD_TOT求和
    SUM(CASE WHEN "BLI_TYPE" = 'Total Due' THEN "TABLE1"."MTD_TOT" ELSE 0 END) AS group_total,
    -- 全局所有符合条件的MTD_TOT总和
    SUM(SUM(CASE WHEN "BLI_TYPE" = 'Total Due' THEN "TABLE1"."MTD_TOT" ELSE 0 END)) OVER() AS grand_total,
    -- 全局唯一BILL_CYCLE的数量
    COUNT(DISTINCT "BILL_CYCLE") OVER() AS distinct_cycle_count,
    -- 最终计算:全局总和除以唯一BILL_CYCLE数量(添加NULLIF避免除零错误)
    SUM(SUM(CASE WHEN "BLI_TYPE" = 'Total Due' THEN "TABLE1"."MTD_TOT" ELSE 0 END)) OVER() 
    / NULLIF(COUNT(DISTINCT "BILL_CYCLE") OVER(), 0) AS X
FROM 
    "TABLE1"    
WHERE 
    "TABLE1"."BILL_CYCLE" BETWEEN :START_DATE AND :END_DATE
GROUP BY 
    "BILL_TYPE", "BILL_CYCLE", "NET_TOTAL"

可选调整说明

如果需求是按BILL_TYPE分组计算总和,再除以该分组下的唯一BILL_CYCLE数量,可给窗口函数添加分区条件:

-- 修改后的X计算逻辑
SUM(SUM(CASE WHEN "BLI_TYPE" = 'Total Due' THEN "TABLE1"."MTD_TOT" ELSE 0 END)) OVER(PARTITION BY "BILL_TYPE") 
/ NULLIF(COUNT(DISTINCT "BILL_CYCLE") OVER(PARTITION BY "BILL_TYPE"), 0) AS X

内容的提问来源于stack exchange,提问作者Avangard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:31:02