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

Oracle中如何将多列(年份列)转换为行实现行列转置?

Oracle 行列转换实现方案

要实现从输入表到期望输出的转换,需要结合UNPIVOT和PIVOT两个操作,步骤如下:

1. 用UNPIVOT将年份列拆成行

先把每个KEY_ID对应的YR1-YR4(最多支持到YR20)拆分为YEAR(年份数字)和VALUE(对应值)的行结构:

SELECT
  KEY_ID,
  TO_NUMBER(SUBSTR(YR_COL, 3)) AS YEAR,
  VALUE
FROM INPUT_TABLE
UNPIVOT (
  VALUE FOR YR_COL IN (YR1, YR2, YR3, YR4) -- 若有更多年份列,继续添加YR5到YR20
) unpvt;

执行后得到中间结果(示例片段):

KEY_IDYEARVALUE
A11
A22
B18
B29

2. 用PIVOT将KEY_ID转为列

基于上述中间结果,按YEAR分组,把不同KEY_ID的值转为横向列,得到最终期望输出:

SELECT
  YEAR,
  A, B, C, D -- 若有更多KEY_ID,需对应添加
FROM (
  SELECT
    KEY_ID,
    TO_NUMBER(SUBSTR(YR_COL, 3)) AS YEAR,
    VALUE
  FROM INPUT_TABLE
  UNPIVOT (
    VALUE FOR YR_COL IN (YR1, YR2, YR3, YR4) -- 扩展到YR20
  ) unpvt
)
PIVOT (
  MAX(VALUE) FOR KEY_ID IN ('A' AS A, 'B' AS B, 'C' AS C, 'D' AS D) -- 对应所有KEY_ID
) pvt
ORDER BY YEAR;

补充说明

  • 单独使用UNPIVOT无法得到目标结果,因为只完成了“列转行”的第一步,必须配合PIVOT完成“行转列”的第二步,才能将KEY_ID转为横向列。
  • 如果年份列或KEY_ID数量不固定,可以用动态SQL自动生成UNPIVOT和PIVOT子句,避免手动编写所有列名。

内容的提问来源于stack exchange,提问作者dc3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:52:35