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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:32:46