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

Oracle 11g XE数据库如何用SQL实现指定表格格式转换?

问题描述

我的Oracle 11g XE数据库中有如下表格数据:

COL1            COL2        COL3       COL4         COL5 COL6   COL7  COL8                                                   
Legacy ID       1234                                        
9/1/2022                   25035389    MT           REC  DEU    BGD   123.76
                                       0.558
9/1/2022                   25035390    MT           REC  DEU    BGD   123.76
                                       0.558
9/1/2022                   25035391    MT           REC  DEU    BGD   123.76
                                       0.558

期望得到如下格式的输出:

COL1            COL2            COL3       COL4    COL5  COL6   COL7 COL8                                                   
Legacy ID       1234                                    
9/1/2022        1234           25035389    MT      REC   DEU    BGD  123.76
9/1/2022        1234           25035389            0.558
9/1/2022        1234           25035390    MT      REC   DEU    BGD  123.76
9/1/2022        1234           25035390            0.558
9/1/2022        1234           25035391    MT      REC   DEU    BGD  123.76
9/1/2022        1234           25035391            0.558

请问如何通过SQL语句实现该需求?

解决方案

可以通过分析函数填充缺失值+拆分记录行的方式实现,具体SQL语句如下:

WITH filled_data AS (
    -- 填充缺失的COL2值,获取上一个非空的COL2内容
    SELECT 
        COL1,
        LAST_VALUE(COL2 IGNORE NULLS) OVER (ORDER BY ROWNUM) AS COL2,
        COL3,
        COL4,
        COL5,
        COL6,
        COL7,
        COL8,
        ROWNUM AS rn
    FROM your_table_name
),
split_rows AS (
    -- 拆分出主记录行
    SELECT 
        COL1,
        COL2,
        COL3,
        COL4,
        COL5,
        COL6,
        COL7,
        COL8
    FROM filled_data
    WHERE COL3 IS NOT NULL
    UNION ALL
    -- 拆分出对应0.558的附属行
    SELECT 
        fd.COL1,
        fd.COL2,
        fd.COL3,
        NULL AS COL4,
        sub.COL5 AS COL5,
        NULL AS COL6,
        NULL AS COL7,
        NULL AS COL8
    FROM filled_data fd
    JOIN filled_data sub ON fd.rn = sub.rn - 1
    WHERE sub.COL5 = '0.558'
)
-- 按指定字段排序,保证输出顺序匹配期望
SELECT * FROM split_rows
ORDER BY COL1, COL3;

关键步骤说明:

  1. 填充COL2:使用LAST_VALUE(COL2 IGNORE NULLS) OVER (ORDER BY ROWNUM),按行号顺序将每行空的COL2自动填充为上一个非空的COL2值(即第一行的1234)。
  2. 拆分记录:通过UNION ALL将主数据行和对应的0.558附属行合并,主行保留所有字段,附属行仅保留必要字段,其余置空。
  3. 排序输出:最后按COL1和COL3排序,确保输出顺序与期望一致。

注意:请将SQL中的your_table_name替换为你实际使用的表名。

内容的提问来源于stack exchange,提问作者Md. Sajjad Hussain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:00:58