Oracle SQL中如何基于另一列的distinct计数计算列平均值?
修正后的SQL查询及问题说明
原代码存在的问题
- 语法错误:括号匹配不当,
COUNT(DISTINCT BILL_CYCLE)未正确闭合;OVER()子句位置错误,导致语法解析失败。 - 冗余操作:嵌套
SUM写法冗余,且1*对计算无实际作用,可直接移除。 - 大小写不一致:列名
Bill_TYPE与后续分组中的BILL_TYPE大小写不统一,可能引发匹配问题。 - 逻辑不规范:原代码试图计算全局总计除以全局唯一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
相关产品推荐
相关产品推荐

