Oracle 12c PL/SQL中实现表格逆透视(Unpivot)求助
解决Oracle 12c宽表转窄表(逆透视)的问题
嘿,你这里搞反啦——你需要的不是PIVOT(行转列),而是**逆透视(UNPIVOT)**操作,因为你要把横向的年份列转换成纵向的行数据。下面给你具体的实现方案:
假设你的原表名为YEARLY_DATA,首先要注意:
KEY是Oracle的保留字,引用这个列时需要用双引号括起来- 年份列(1995、1996...)是数字开头的标识符,同样需要用双引号引用
完整SQL语句
SELECT "KEY", ROW_NUMBER() OVER (PARTITION BY "KEY" ORDER BY SEQ_YR) AS SEQ_NBR, SEQ_YR, VALUE_SUM FROM YEARLY_DATA UNPIVOT ( VALUE_SUM FOR SEQ_YR IN ( "1995" AS 1995, "1996" AS 1996, "1997" AS 1997, "1998" AS 1998, "1999" AS 1999, "2000" AS 2000, "2001" AS 2001, "2002" AS 2002, "2003" AS 2003 ) ) ORDER BY "KEY", SEQ_NBR;
关键部分解释
UNPIVOT子句:
VALUE_SUM是我们给原年份列的数值起的别名,对应目标表中的VALUE_SUM字段SEQ_YR用来存储转换后的年份值,对应目标表的SEQ_YR字段IN子句里明确指定每个原横向列(比如"1995")要转换成的行值(AS 1995)
SEQ_NBR生成:
- 使用
ROW_NUMBER()窗口函数,按"KEY"分组,再按SEQ_YR(年份)从小到大排序,自动生成1到9的序号,正好匹配你需要的SEQ_NBR
- 使用
执行这段SQL后,就能得到你想要的目标表格式啦~
内容的提问来源于stack exchange,提问作者Yash Sharma
相关产品推荐
相关产品推荐

