Oracle APEX分组柱状图SQL需求:按TYPE总成本排序分组
Oracle APEX分组柱状图SQL实现方案
核心需求
实现按TYPE和NAME分组汇总成本,同时按TYPE的总成本排序,最终适配Oracle APEX的分组柱状图展示要求。
场景说明
现有数据表包含TYPE、NAME、COST三列,需在Oracle APEX中创建分组柱状图:
- X轴绑定
TYPE字段 - Y轴展示
COST数值,按NAME分组区分系列 - 要求按
TYPE的总成本从高到低排序,优先展示成本最高的TYPE
示例数据
| TYPE类型 | NAME名称 | COST成本 |
|---|---|---|
| bad | A | 500 |
| good | A | 300 |
| bad | A | 1000 |
| very bad | B | 200 |
| very good | B | 2300 |
| good | C | 400 |
| bad | A | 100 |
| very good | C | 700 |
| good | A | 800 |
| bad | A | 400 |
| very good | C | 500 |
| good | B | 300 |
| bad | C | 350 |
| bad | C | 600 |
| good | B | 440 |
| bad | B | 502 |
| bad | A | 300 |
| good | A | 456 |
| bad | B | 340 |
预期结果(顺序敏感)
| TYPE类型 | NAME名称 | TYPE和NAME分组成本总和 | TYPE排名 |
|---|---|---|---|
| bad | A | 2300 | 1 |
| bad | B | 842 | 1 |
| bad | C | 950 | 1 |
| very good | B | 2300 | 2 |
| very good | C | 1200 | 2 |
| good | A | 1556 | 3 |
| good | B | 740 | 3 |
| good | C | 400 | 3 |
| very bad | B | 200 | 4 |
当前代码问题
现有SQL存在逻辑冲突:窗口函数SUM(COST) OVER(PARTITION BY TYPE)不能直接与GROUP BY后的聚合函数混用,且未正确生成TYPE排名,也未给分组成本总和命名。
SELECT TYPE, NAME, SUM(COST) OVER(PARTITION BY TYPE) AS SUM_COST_BY_TYPE, SUM(COST) FROM mytable GROUP BY NAME, TYPE ORDER BY SUM_COST_BY_TYPE DESC
另外,Oracle APEX的分组柱状图要求数据源必须包含GROUP BY,因此需先完成分组聚合,再通过窗口函数补充TYPE级别的统计数据。
正确SQL实现
通过嵌套子查询分步处理,先完成分组聚合,再计算TYPE总成本与排名,最终按要求排序:
WITH grouped_data AS ( -- 第一步:按TYPE+NAME分组计算成本总和,满足APEX的GROUP BY要求 SELECT TYPE, NAME, SUM(COST) AS TYPE_NAME_COST_SUM FROM mytable GROUP BY TYPE, NAME ), type_summary AS ( -- 第二步:基于分组数据计算TYPE总成本和排名 SELECT gd.*, SUM(gd.TYPE_NAME_COST_SUM) OVER(PARTITION BY gd.TYPE) AS TYPE_TOTAL_COST, DENSE_RANK() OVER(ORDER BY SUM(gd.TYPE_NAME_COST_SUM) OVER(PARTITION BY gd.TYPE) DESC) AS TYPE_RANK FROM grouped_data gd ) -- 第三步:输出匹配预期结果的列,并按TYPE总成本排序 SELECT TYPE AS "TYPE类型", NAME AS "NAME名称", TYPE_NAME_COST_SUM AS "TYPE和NAME分组成本总和", TYPE_RANK AS "TYPE排名" FROM type_summary ORDER BY TYPE_TOTAL_COST DESC, TYPE, NAME;
代码说明
- grouped_data子查询:先按
TYPE和NAME分组聚合,得到每个细分组的成本总和,完全符合APEX分组柱状图的数据源要求。 - type_summary子查询:用窗口函数计算每个
TYPE的总成本,同时通过DENSE_RANK()生成排名(相同总成本的TYPE会获得一致排名)。 - 最终查询:重命名列名匹配预期结果,按
TYPE总成本降序排序,同时保证同TYPE下的NAME有序。
APEX柱状图配置指引
将上述SQL作为数据源后,在APEX中配置:
- X轴选择
TYPE类型字段 - Y轴选择
TYPE和NAME分组成本总和字段 - 分组系列选择
NAME名称字段 - 排序规则已在SQL中定义,无需额外配置
内容的提问来源于stack exchange,提问作者Jax
相关产品推荐
相关产品推荐

