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

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;

关键部分解释

  1. UNPIVOT子句:

    • VALUE_SUM是我们给原年份列的数值起的别名,对应目标表中的VALUE_SUM字段
    • SEQ_YR用来存储转换后的年份值,对应目标表的SEQ_YR字段
    • IN子句里明确指定每个原横向列(比如"1995")要转换成的行值(AS 1995)
  2. SEQ_NBR生成:

    • 使用ROW_NUMBER()窗口函数,按"KEY"分组,再按SEQ_YR(年份)从小到大排序,自动生成1到9的序号,正好匹配你需要的SEQ_NBR

执行这段SQL后,就能得到你想要的目标表格式啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:58:57