Oracle SQL如何按caseName与caseBy分别分组生成指定结果集?
Oracle SQL实现按caseName+caseBy分组并生成UI友好的格式化结果
看起来你需要的不仅是简单的GROUP BY分组,还要生成带有缩进对齐、汇总行的UI展示格式结果。在Oracle中,我们可以通过组合分组查询、UNION ALL合并明细与汇总行、以及字符串格式化函数来实现这个需求。
1. 先明确需求细节
从你给出的示例结果可以看出:
- 核心分组键是
caseName+caseBy,这两个字段相同的行归为一组 - 每个分组下包含
Above、In、Below三个zone的明细行,以及一条汇总行 - 同一分组内,除第一行外,
caseName和caseBy字段需要留空(用空格填充实现对齐) - 汇总行的
Cases、Prepped是分组内所有zone的数值之和,%Complete是百分比的累加(比如BCD的汇总150%是50%+100%)
2. 实现SQL代码
下面是完整的Oracle SQL实现,我会逐段解释:
WITH base_data AS ( -- 先把原始数据中的%Complete转成数值,方便计算 SELECT caseName, caseBy, zone, Cases, Prepped, TO_NUMBER(REPLACE("%Complete", '%')) AS pct_complete_num, "%Complete" AS pct_complete_str FROM your_table_name -- 替换成你的实际表名 ), grouped_details AS ( -- 按caseName+caseBy+zone分组,保留明细行 SELECT caseName, caseBy, zone, SUM(Cases) AS Cases, SUM(Prepped) AS Prepped, SUM(pct_complete_num) AS total_pct_num, MAX(pct_complete_str) AS pct_complete_str, 1 AS row_order -- 明细行排序优先级高于汇总行 FROM base_data GROUP BY caseName, caseBy, zone ), grouped_totals AS ( -- 生成每个caseName+caseBy的汇总行 SELECT caseName, caseBy, '----------------------------' AS zone, -- 汇总行的zone标记 SUM(Cases) AS Cases, SUM(Prepped) AS Prepped, SUM(pct_complete_num) AS total_pct_num, TO_CHAR(SUM(pct_complete_num)) || '%' AS pct_complete_str, 2 AS row_order -- 汇总行排最后 FROM base_data GROUP BY caseName, caseBy ), combined_data AS ( -- 合并明细行和汇总行 SELECT * FROM grouped_details UNION ALL SELECT * FROM grouped_totals ), final_formatted AS ( -- 处理显示格式:同一分组内除第一行外,caseName和caseBy用空格填充对齐 SELECT CASE WHEN ROW_NUMBER() OVER (PARTITION BY caseName, caseBy ORDER BY row_order, zone) = 1 THEN caseName ELSE ' ' -- 空格长度可根据UI需求调整 END AS caseName, CASE WHEN ROW_NUMBER() OVER (PARTITION BY caseName, caseBy ORDER BY row_order, zone) = 1 THEN TO_CHAR(caseBy) ELSE ' ' END AS caseBy, zone, Cases, Prepped, CASE WHEN row_order = 1 THEN pct_complete_str ELSE pct_complete_str END AS "%Complete" FROM combined_data ORDER BY caseName, caseBy, row_order, zone ) SELECT * FROM final_formatted;
3. 代码解释
- base_data CTE:将字符串类型的
%Complete转换为数值,方便后续汇总计算,同时保留原始字符串格式用于展示。 - grouped_details CTE:按
caseName+caseBy+zone分组,若原始数据中同一zone有多行,SUM会自动汇总;标记行类型为明细行(row_order=1),确保排序时在汇总行之前。 - grouped_totals CTE:按
caseName+caseBy生成汇总行,计算所有zone的数值之和,重新拼接百分比字符串;标记行类型为汇总行(row_order=2)。 - combined_data CTE:合并明细行与汇总行,为后续排序和格式化做准备。
- final_formatted CTE:使用
ROW_NUMBER()分析函数识别分组内的第一行,仅第一行显示caseName和caseBy,后续行用空格填充实现对齐;最后按指定规则排序输出。
4. 注意事项
- 替换代码中的
your_table_name为你的实际表名。 - 空格填充的长度可根据UI展示的字段宽度调整,示例中用了10个空格适配对齐需求。
- 若原始数据中同一
caseName+caseBy+zone存在多行,grouped_details中的SUM会自动完成明细汇总,符合分组逻辑。
内容的提问来源于stack exchange,提问作者Geek
相关产品推荐
相关产品推荐

