您的位置:首页 > 数据库 > Oracle

ORACLE中一个简单的UNPIVOT例子

2015-02-10 11:40 316 查看
【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(

微积分,
线性代数,
数据结构,
操作系统))


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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: