ORACLE中一个简单的UNPIVOT例子

本文介绍了Oracle 11g中UNPIVOT功能的使用,通过一个学生考试成绩的例子展示了如何将列转换为行以进行数据分析。利用UNPIVOT,可以方便地找到学生某学期得分最低的科目,并讨论了UNPIVOTClause的组成部分,包括INCLUDE/EXCLUDE NULLS选项、指定输出列名等。此外,还给出了一个将低于80分的成绩加12分的场景应用。

【Oracle 11g版本】 

之前写过一个很简单的PIVOT的例子,这次补充一个UNPIVOT的例子,其实这个功能在日常应用中还是比较有用,以一个最简单的例子来说,数据库中有某个学生一学期的考试科目成绩,如下语句

SELECT '罗飞' STU_NAME,
       '2001-2002' TERM,
       '90' 微积分,
       '88' 线性代数,
       '85' 数据结构,
       '70' 操作系统
  FROM DUAL

 

执行之后是如下结果:

 

现在需要找出这个学生2001到2002学期考试成绩得分最低的科目,因为传统的关系数据库是按照行存储,而MAX()和MIN()仅仅对列生效,所以,必然要进行一个行列转换,否则,只能通过写过程的方式来实现,还好,Oracle 11g开始提供了这个函数,UNPIVOT(),稍微调整一下代码如下:

SELECT COURSE_MARK
  FROM (SELECT '罗飞' STU_NAME,
               '2001-2002' TERM,
               '90' 微积分,
               '88' 线性代数,
               '85' 数据结构,
               '70' 操作系统
          FROM DUAL) UNPIVOT(COURSE_MARK FOR TYPE IN(
                                                     微积分,
                                                     线性代数,
                                                     数据结构,
                                                     操作系统))


执行结果如下:

好了,剩下的事情就留给MAX()或者MIN()去完成,很方便

 

关于UNPIVOT,官方有如下的说法:

The unpivot_clause rotatescolumns into rows.

(1)The INCLUDE | EXCLUDE NULLS clausegives you the option of including or excluding null-valued rows. INCLUDE NULLS causesthe unpivot operation to include null-valued rows; EXCLUDE NULLS eliminatesnull-values rows from the return set. If you omit this clause, then the unpivotoperation excludes nulls.

(2)unpivot_clause: this clause specifies a name for a column to represent the unpivotedmeasure values. 

(3)Inthe pivot_for_clause, specify a name for eachoutput column that will hold descriptor values, such as quarter or product.

(4)Inthe unpivot_in_clause, specify the input datacolumns whose names will become values in the output columns of the pivot_for_clause.These input data columns have names specifying a category value, such as Q1,Q2, Q3, Q4. The optional AS clause lets you map the input data columnnames to the specified literal values in the output columns.

 

 

剩下的,对上面的例子再改造一下,这个学生可能享受到了某种加分政策,于是,把所有低于80的成绩统一加12分,12分,听上去好豪华,可惜我从来没有过,语句如下:

SELECT CASE
         WHEN COURSE_MARK < 80 THEN
          COURSE_MARK + 12
         WHEN COURSE_MARK > 80 THEN
          TO_NUMBER(COURSE_MARK)
       END COURSE_MARK
  FROM (SELECT '罗飞' STU_NAME,
               '2001-2002' TERM,
               '90' 微积分,
               '88' 线性代数,
               '85' 数据结构,
               '70' 操作系统
          FROM DUAL) UNPIVOT(COURSE_MARK FOR TYPE IN(
                                                     
                                                     微积分,
                                                     线性代数,
                                                     数据结构,
                                                     操作系统))


其实,例子都很简单,原始语句也很简单,只要发挥想象力,会有很多的结果:)


 

### Oracle UNPIVOT 函数详解 #### 功能描述 Oracle UNPIVOT 是一种用于将列转换为行的操作,这使得用户能够把原本分布在不同列中的数据集中到单个列中显示。这种变换对于数据分析和报表生成非常有用。 #### 基本语法结构 UNPIVOT 的基础语法规则如下: ```sql SELECT * FROM table_name UNPIVOT ( value_column FOR name_column IN (column_list) ); ``` 这里 `value_column` 表示新产生的数值所在的列名称;`name_column` 则指定了这些值原来所属的列名将会被存储在哪一列里;而 `column_list` 就是要参与转换的具体列列表[^2]。 #### 实际应用案例 考虑有一个简单的销售记录表格 `sales_data`,其包含产品编号 (`product_id`) 和三个季度销售额度 (`q1_sales`, `q2_sales`, `q3_sales`) 如下所示: | product_id | q1_sales | q2_sales | q3_sales | |------------|----------|----------|----------| | 1 | 100 | 150 | 200 | | 2 | 80 | 90 | 70 | 现在希望通过使用 UNPIVOT 来获取每条记录按季度展开的结果形式,即每个产品的各个季度销量单独成行展示出来。实现此目的可以通过下面这段 SQL 查询完成: ```sql SELECT product_id, quarter AS period, sales_amount FROM sales_data UNPIVOT ( sales_amount FOR quarter IN (q1_sales AS 'Q1', q2_sales AS 'Q2', q3_sales AS 'Q3') ); ``` 执行上述命令之后会得到类似这样的输出结果: | product_id | period | sales_amount | |------------|--------|--------------| | 1 | Q1 | 100 | | 1 | Q2 | 150 | | 1 | Q3 | 200 | | 2 | Q1 | 80 | | 2 | Q2 | 90 | | 2 | Q3 | 70 | 这样就实现了从宽表向长表的数据形态转变过程[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值