`

oracle查询中行转列、列转行以及PIVOT、UNPIVOT使用

 
阅读更多

 

行转列

行转列的大致意思是,将表中多行数据转成一行的多个字段输出。需要行转列的业务逻辑通常是,将表中的一个字段分类统计后作为多个结果字段输出。

 

一个简单例子:

有一个学生表,有姓名、学科、成绩三个字段

create table studentScores(
       username varchar2(20),
       subject  varchar2(30),
       score    float
)
insert into studentScores values('justin','语文',90);
insert into studentScores values('justin','英语',80);
insert into studentScores values('justin','数学',90);
insert into studentScores values('jia','语文',90);
insert into studentScores values('jia','英语',80);
insert into studentScores values('jia','数学',90);

 业务场景是我需要将每个学生的各科成绩拉成一行,方便查看统计。大致效果如下图

 

 

通常都会用到GROUP BY 和 CASE WHEN

select username,
       max(case subject when '语文' then score else 0 end) as 语文,
       max(case subject when '数学' then score else 0 end) as 数学,
       max(case subject when '英语' then score else 0 end) as 英语
 from studentScores
 group by username

 

pivot函数

11g之后oracle提供了一个pivot函数来专门实现这个行转列功能,上面的sql语句可用下面语句代替

 select username,"'语文'","'数学'","'英语'" //这里也能用*,用pivot函数查出来的字段名称就是‘语文’注意这两个单引号也是名称一部分,所以这行要用双引号括起来
      from studentScores
      pivot(max(score)   //聚合列取值
                for subject in ('语文','数学','英语')) //定义哪个列的哪些值 转成新的列  以及新列的顺序

  pivot函数有个缺点。使用GROUP BY + CASE WHEN写法时,查询结果行数就是 group by字段非重复值的数量。而pivot查询的结果相当于group by除聚合列和待行转列列 之外所有列的结果。比如为studentScores表添加一个teacher字段,输出不同值,还是上面的pivot查询语句,结果如下:

 

 还有试过不手动输入上面‘语文’等列,而是用SELECT DISTINCT SUBJECT FROM STUDENTSCORES子查询结果作为in的值,结果发现是不行的。所以抛开性能(不知道性能有没有提示)不谈,除了sql语句比较简洁外,这个函数没什么优越性

 

 

列转行

列转行更容易理解,将表中多个列(一般是同一纬度相关)每个列拉成一行数据。

比如有个项目供应量表,固定供应方有海外、本地、南方、北方四个,表如下:

create table projectDetail(
 projectName varchar2(20),
 overseaSupply int,
 nativeSupply int,
 southsupply int,
 northsupply int);
 
 insert into projectdetail values('A',100,100,100,100);
 insert into projectdetail values('B',50,50,50,50);
 insert into projectdetail values('C',200,200,200,200);

 现在业务需求是展示项目名,供应方,供应量三个字段,需要展示结果如下:

 

 

 查询逻辑一般就是查询相关字段取统一别名,然后用union all将结果连接

select projectname,'overseasupply' as supplier,overseasupply as supplysum
 from projectdetail
 union all
 select projectname,'nativeSupply' as supplier,nativeSupply as supplysum
 from projectdetail
 union all
 select projectname,'southsupply' as supplier,southsupply as supplysum
 from projectdetail
 union all
 select projectname,'northsupply' as supplier,northsupply as supplysum
 from projectdetail

 

unpivot

使用unpivot函数获得上面相同效果的sql语句如下

select projectname, supplier, supplysum   //与下面别名相同
   from projectdetail unpivot(supplysum //为列转行中多列变成一列的 值取别名
                                 for supplier    //在结果中成为一列的原多列取统一别名
                                                   in(overseasupply,
                                                        nativeSupply,
                                                        southsupply,
                                                        northsupply))

 

  • 大小: 4.9 KB
  • 大小: 8.4 KB
  • 大小: 20 KB
分享到:
评论

相关推荐

    Oracle行转列之pivot

    在Oracle数据库中,行转列(也称为数据透视)和列转行(unpivot)是SQL查询中用于数据转换的高级功能。从Oracle 11g版本开始,引入了PIVOT和UNPIVOT关键字,以支持显式的查询转换,即从行数据转换为列数据,或从列...

    Oracle行转列(不定列)

    本篇文章将详细探讨Oracle如何实现行转列为列的过程,以及在面对不确定列数时的解决方案。 在传统的SQL查询中,数据通常是以行的形式存储和展示。然而,在某些场景下,我们可能需要将同一类别的数据从多行转换为一...

    SQL行列转换 Pivot UnPivot

    Pivot 语法的主要作用是将列值旋转为列名,即行转列。其基本语法为: ``` SELECT * FROM table_source PIVOT (聚合函数(value_column) FOR pivot_column IN ()) AS P; ``` 其中,聚合函数可以是 SUM、AVG、MAX、MIN ...

    oracle动态行转列

    其中,“行转列”(Pivot)是一种常见的数据转换需求,尤其在数据分析和报告生成时尤为重要。本文将深入探讨如何通过Oracle中的存储过程实现动态“行转列”,并结合给定文件的信息,详细解析其工作原理、优点及应用...

    oracle行转列

    Oracle提供了多种方法来实现这一目标,包括使用Pivot和Unpivot操作,以及自定义的SQL查询技巧。 1. PIVOT操作:Oracle 11g开始引入了PIVOT关键字,它允许用户直接在SQL查询中将行数据转换为列数据。例如,假设有一...

    枢纽表达式PIVOT和UNPIVOT的简单用法,sql server 2005,列转成行

    "枢纽表达式PIVOT和UNPIVOT的简单用法" 枢纽表达式PIVOT和UNPIVOT是SQL Server 2005中新增的关系运算符,用于...但是,需要注意的是,PIVOT和UNPIVOT的使用需要根据实际情况进行调整,以确保查询结果的正确性和效率。

    Oracle的列转行问题

    列转行(Pivot)和行转列(Unpivot)是两种基本操作,可以将数据按照不同的维度进行组织。传统的列转行方法通常涉及`DECODE`或`CASE`函数与聚合函数如`MAX`或`MIN`的结合,但这些方法可能在处理大量数据时对性能造成...

    oracle行转列oracle行转列

    在Oracle数据库中,将行数据转换为列数据是一种...总结来说,Oracle中的行转列操作主要依赖于`DECODE`函数和`GROUP BY`子句,以及动态SQL技术,这些工具可以帮助我们更有效地管理和展示数据,满足复杂的数据分析需求。

    pivot_unpivot

    ### Oracle 11g中的pivot和unpivot转换操作详解 #### 一、Pivot与Unpivot概述 在Oracle 11g中引入了两项新功能:`PIVOT` 和 `UNPIVOT`,这两项功能使得在SQL中进行数据的行列转换变得更加简单和直观。这些操作特别...

    Mysql 行转列,列转行 SQL语句和示例表结构SQL

    MySQL 提供了两种转换数据布局的方法:行转列(Pivot)和列转行(Unpivot),这在处理复杂的数据汇总和展示时非常有用。本文将深入探讨这两种转换方法,并提供具体的 SQL 语句示例,以及创建示例表结构的 SQL 代码。...

    oracle 行转列

    在Oracle数据库中,"行转列"是一种常见的数据处理需求,它将多行数据转换为单行的多个列,使得数据展示更为清晰、简洁。这种操作通常涉及到SQL查询中的PIVOT函数,它是Oracle 11g引入的新特性,极大地增强了SQL的...

    Mysql中行转列算法

    在数据库管理领域,数据转换是一项常见且重要的任务,其中“行转列”(Pivot)是一种将表格数据从行格式转换为列格式的技术,尤其在处理汇总数据、数据分析或报表生成时极为有用。本文将深入探讨MySQL中的行转列算法...

    sql server 中行转列

    在 SQL Server 中实现行转列的方法多种多样,包括使用静态 SQL 结合 `CASE` 和 `SUM` 函数的方式,以及使用动态 SQL 构建复杂查询的方式。这两种方法各有优势: - **静态 SQL**:适合于列名固定的情况,编写简单...

    access行转列示例

    在Access中,可以使用SQL的PIVOT函数或者通过创建交叉表查询来实现行转列。PIVOT函数允许用户指定原始数据中的行值作为新的列名,并对这些行值进行聚合计算。例如,假设我们有一个销售数据表,包含产品、地区和销售...

    Sql,oracle数据表行转列问题

    在SQL Server 2005中,我们可以使用PIVOT函数来实现行转列操作。下面是一个示例代码: ```sql select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b ``` 这个查询将生成一个新的...

    DB2 SQL 实现行转列,列转行

    DB2 SQL 通过函数(CONCAT/POSSTR/LOCATE)实现行转列,列转行 可以按照标点把多列转换为一行,多行转换为一列

    SQL知识点之列转行Unpivot函数

    在本篇文章中,我们将深入探讨SQL的Unpivot函数,以及如何使用它来实现列转行的操作。 首先,让我们回顾一下上一篇文章中提到的Pivot函数。Pivot函数是用于将数据的行转换为列,通常用于数据透视或汇总,使得特定的...

    ORACLE 列转行 DECODE函数用法

    下面我们将详细讲解DECODE函数的使用方法以及如何在列转行操作中应用它。 DECODE函数的基本语法如下: ```sql DECODE(column, value1, result1, value2, result2, ..., default_result) ``` 这里`column`是要检查的...

    列转行小工具

    列转行的过程通常涉及Oracle数据库中的PIVOT函数或UNPIVOT操作。PIVOT用于将行数据转换为列,而UNPIVOT则相反,将列数据转换为行。下面将详细介绍这两种操作以及它们在实际应用中的使用场景。 1. PIVOT函数:当原始...

Global site tag (gtag.js) - Google Analytics