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_ID | YEAR | VALUE |
|---|---|---|
| A | 1 | 1 |
| A | 2 | 2 |
| B | 1 | 8 |
| B | 2 | 9 |
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
相关产品推荐
相关产品推荐

