千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > Oracle Unpivot详解

Oracle Unpivot详解

来源:千锋教育
发布人:xqq
时间: 2023-11-24 21:10:33 1700831433

一、UNPIVOT概述

UNPIVOT 是 Oracle 中的一种操作,可以将多个列按照一定的规则合并成一个列。UNPIVOT的常用语法为:UNPIVOT (列名1, 列名2, ... 列名n) INCLUDE(NULLS) [AS] 集合

集合符合集合的语法,需要有一个SELECT语句作为基础数据集,该基础数据集中包含待合并的列,需要使用UNPIVOT来合并多个列。

UNPIVOT是广泛应用在数据仓库和BI(商业智能)场景中的,常用于将拥有多个相同性质列的表进行重构,也能够将多张表中的相同字段进行合并完整数据集。


SELECT * FROM (
  SELECT deptno, job, sal, comm
  FROM emp
) 
UNPIVOT INCLUDE(NULLS) (
  SALARY
  FOR TYPE IN (SAL, COMM)
);

二、UNPIVOT实例

下面展示一个UNPIVOT的应用实例,假设我们有一个包含各个国家2020年1-12月份旅游人数的表。我们需要将所有旅游人数合并成为一个列,可以使用UNPIVOT来完成。具体实现代码如下:


CREATE TABLE tourism(
  country VARCHAR2(100),
  Jan NUMBER,
  Feb NUMBER,
  Mar NUMBER,
  Apr NUMBER,
  May NUMBER,
  Jun NUMBER,
  Jul NUMBER,
  Aug NUMBER,
  Sep NUMBER,
  Oct NUMBER,
  Nov NUMBER,
  Dec NUMBER
);

INSERT INTO tourism VALUES('China',100,200,300,400,500,600,700,800,900,1000,1100,1200);
INSERT INTO tourism VALUES('USA',200,400,600,800,1000,1200,1400,1600,1800,2000,2200,2400);
INSERT INTO tourism VALUES('Japan',150,300,450,600,750,900,1050,1200,1350,1500,1650,1800);

SELECT * FROM tourism;

SELECT country, visitors, month
FROM 
(
  SELECT *
  FROM tourism
) 
UNPIVOT INCLUDE(NULLS) (
  visitors
  FOR month IN (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
);

三、UNPIVOT扩展知识

除了基本的UNPIVOT操作之外,还有一些特殊情况需要注意。

1.包含NULLS的情况

在UNPIVOT语句中,加入 INCLUDE(NULLS) 可以将列值为空的情况也纳入UNPIVOT操作中。


SELECT country, visitors, month
FROM 
(
  SELECT *
  FROM tourism
) 
UNPIVOT INCLUDE(NULLS) (
  visitors
  FOR month IN (Jan, Feb, Mar, Apr, May, NULL, NULL, NULL, Sep, Oct, Nov, Dec)
);

2.不同类型列的合并

当待合并的列的类型不同时,列的类型将自动转换成相同的类型,比如,等号右边的列都是NUMBER类型,而等号左边的列是VARCHAR2类型,UNPIVOT操作后country列自动转换为NUMBER类型。


SELECT *
FROM 
(
  SELECT *
  FROM tourism
) 
UNPIVOT INCLUDE(NULLS) (
  tourists, country
  FOR month IN (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
);

3.使用UNION ALL 和行列转置实现UNPIVOT操作

如果数据集本身没有支持UNPIVOT的操作,我们可以使用UNION ALL和行列转置来实现UNPIVOT操作。


SELECT country, visitors, 'Jan' AS month
FROM tourism
UNION ALL
SELECT country, visitors, 'Feb' AS month
FROM tourism
UNION ALL
...
SELECT country, visitors, 'Dec' AS month
FROM tourism;

四、总结

本文详细介绍了Oracle中的UNPIVOT操作,包括UNPIVOT的概述、应用实例和扩展知识。对于数据仓库和BI领域的开发者,UNPIVOT是一个必须掌握的SQL操作,可以方便的解决表中多个相同性质列的重构问题。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT