PIVOT 行列转置函数的使用

Posted xuanjiaming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PIVOT 行列转置函数的使用相关的知识,希望对你有一定的参考价值。

数据如下图,有一个需求,统计scott.emp中不同部门(deptno)的薪资(sal)总数。

技术图片

如果不考虑行列转换的话,那么最基本的方法是通过deptno进行分组:

SELECT deptno, SUM(sal) FROM scott.emp GROUP BY deptno;

效果如下:

技术图片

如果要在一行中显示所有部门的薪资总和,那么可以使用SUM(DECODE...)这种方式:

SELECT SUM(DECODE(deptno, 10, sal)) AS dept_10,
       SUM(DECODE(deptno, 20, sal)) AS dept_20,
       SUM(DECODE(deptno, 30, sal)) AS dept_30
  FROM scott.emp;

效果如下:

技术图片

或者是使用SUM(CASE...)这种方式做统计:

SELECT SUM(CASE
             WHEN deptno = 10 THEN
              sal
             ELSE
              0
           END) AS dep_10,
       SUM(CASE
             WHEN deptno = 20 THEN
              sal
             ELSE
              0
           END) AS dept_20,
       SUM(CASE
             WHEN deptno = 30 THEN
              sal
             ELSE
              0
           END) AS dept_30  
  FROM   scott.emp;

 如果使用PIVOT的话,效果和前两种是一样的:

SELECT *
  FROM (SELECT sal, deptno FROM scott.emp) PIVOT(SUM(sal) sum_sal FOR deptno IN(10 AS
                                                                                dept_10,
                                                                                20 AS
                                                                                dept_20,
                                                                                30 AS
                                                                                dept_30));

在PIVOT内可以统计多个,例如,统计各个部门的薪资总和和奖金总和并将结果在一行显示:

SELECT *
  FROM (SELECT sal, comm, deptno FROM scott.emp) PIVOT(SUM(sal) sum_sal, SUM(NVL(comm, 0)) sum_comm FOR deptno IN(10 AS
                                                                                                                  dept_10,
                                                                                                                  20 AS
                                                                                                                  dept_20,
                                                                                                                  30 AS
                                                                                                                  dept_30));

效果如下:

技术图片

如果数据较多没办法一一列举的话,可以使用PIVOT XML(SUM(..)...IN (ANY))的方式查询,查询出来的结果是一个以CLOB类型存储的XML数据,然后可以在存储过程中处理查询的结果:

SELECT deptno_xml
  FROM ((SELECT sal, deptno FROM scott.emp) PIVOT
        XML(SUM(sal) FOR deptno IN (ANY)));

查询出来的结果如下:

<PivotSet>
  <
item><column name="DEPTNO">10</column><column name="SUM(SAL)">8750</column></item>
  <
item><column name="DEPTNO">20</column><column name="SUM(SAL)">10875</column></item>
  <
item><column name="DEPTNO">30</column><column name="SUM(SAL)">9400</column></item>
</
PivotSet>

 

以上是关于PIVOT 行列转置函数的使用的主要内容,如果未能解决你的问题,请参考以下文章

sql server多重行列转置的优化

SQL Server pivot行列转换案例分析

Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列

写一个函数,使给定的一个3*3的二维整型数组转置,即行列互换

写一个函数,使给定的一个3X3的二维整型数组转置,即行列互换。

SQL 行列转换