ZBLOG

Oracle 列转行

在 Oracle 数据库中,将列数据转换为行数据(即列转行)通常可以通过以下几种方法实现:


1. 使用 UNPIVOT 操作(Oracle 11g及以上)

UNPIVOT 是 Oracle 提供的标准语法,用于将列转换为行。
示例:
假设有表 sales_data

CREATE TABLE sales_data (
    id NUMBER,
    product VARCHAR2(50),
    q1 NUMBER,
    q2 NUMBER,
    q3 NUMBER,
    q4 NUMBER
);

要将季度列(q1, q2, q3, q4)转换为行:

SELECT id, product, quarter, sales
FROM sales_data
UNPIVOT (
    sales FOR quarter IN (q1 AS 'Q1', q2 AS 'Q2', q3 AS 'Q3', q4 AS 'Q4')
);

结果:

ID PRODUCT QUARTER SALES
1 Apple Q1 100
1 Apple Q2 200

2. 使用 UNION ALL(兼容所有版本)

如果版本较低或需要更灵活的控制,可以使用 UNION ALL

SELECT id, product, 'Q1' AS quarter, q1 AS sales FROM sales_data
UNION ALL
SELECT id, product, 'Q2' AS quarter, q2 AS sales FROM sales_data
UNION ALL
SELECT id, product, 'Q3' AS quarter, q3 AS sales FROM sales_data
UNION ALL
SELECT id, product, 'Q4' AS quarter, q4 AS sales FROM sales_data
ORDER BY id, quarter;

3. 使用 CROSS JOIN 与结构化数据

结合 CROSS JOIN 和表值构造函数(如 VALUES 或子查询)动态生成行:

WITH quarters (q_name, col_name) AS (
    SELECT 'Q1', 'q1' FROM DUAL UNION ALL
    SELECT 'Q2', 'q2' FROM DUAL UNION ALL
    SELECT 'Q3', 'q3' FROM DUAL UNION ALL
    SELECT 'Q4', 'q4' FROM DUAL
)
SELECT 
    s.id,
    s.product,
    q.q_name AS quarter,
    CASE q.col_name 
        WHEN 'q1' THEN s.q1
        WHEN 'q2' THEN s.q2
        WHEN 'q3' THEN s.q3
        WHEN 'q4' THEN s.q4
    END AS sales
FROM sales_data s
CROSS JOIN quarters q;

注意事项

  • 性能UNPIVOT 是原生操作,通常比 UNION ALL 更高效。
  • 动态列:如果列名不固定,可能需要结合动态 SQL(如使用 PL/SQL)。
  • 空值处理:默认情况下,UNPIVOT 会忽略 NULL 值,若需保留可使用 INCLUDE NULLS

如果有具体表结构或需求,可以进一步提供细节以优化方案!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=8403

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?