Oracle Unpivot详解

一、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操作,可以方便的解决表中多个相同性质列的重构问题。

原创文章,作者:YOVWM,如若转载,请注明出处:https://www.506064.com/n/370357.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
YOVWMYOVWM
上一篇 2025-04-20 13:09
下一篇 2025-04-20 13:09

相关推荐

  • 如何将Oracle索引变成另一个表?

    如果你需要将一个Oracle索引导入到另一个表中,可以按照以下步骤来完成这个过程。 一、创建目标表 首先,需要在数据库中创建一个新的表格,用来存放索引数据。可以通过以下代码创建一个…

    编程 2025-04-29
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • C语言贪吃蛇详解

    一、数据结构和算法 C语言贪吃蛇主要运用了以下数据结构和算法: 1. 链表 typedef struct body { int x; int y; struct body *nex…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25

发表回复

登录后才能评论