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>

原文地址:https://www.cnblogs.com/xuanjiaming/p/11691164.html

时间: 2024-11-05 15:44:49

PIVOT 行列转置函数的使用的相关文章

还在傻傻用Ctrl+C和Ctrl+V吗?这2个行列转置方法助你效率提80%!

Excel行转为列,列转为行的例子特别常见,以下这两个方法可以帮助你解决99%行列转置问题! 点击文章右上角给小编一个"关注"鼓励,谢谢您! 我们先来对比下面两张图片: 当下面表格的名字越来越多时,表格也就越来越来,查看也就越来越麻烦. 而下面这个表格显示看起来比较舒心,这也是我们平时制作表格的方式. 那么通过对比,我们知道哪个图片才是我们想要的.但是有时候别人发给我们的表格并不是我们想要的方式,而且数据量很大,这时该用什么方法变成我们想要的呢? 方法一:使用"选择性粘贴&q

简化实现动态行列转置的SQL

动态行列转换的计算在实际业务中非经常见,网上各类技术论坛上都有讨论,比方以下这些问题: http://www.iteye.com/problems/87788 http://bbs.csdn.net/topics/390869577 http://bbs.csdn.net/topics/391000711 http://bbs.csdn.net/topics/391001035 http://bbs.csdn.net/topics/390888703 http://bbs.csdn.net/to

Excel 行列转置 解决竖向拉,字母跟着递增的问题

今天工作中遇到需要将Excel行列转置涉及到的数据单元格一共几千个 查询网上说可以通过复制粘贴单元格,粘贴选项中转置一项实现,但是所涉及的sheet页中,数据格式和单元格格式各不一样,转置失败! 怎么做呢? 先看看查询Excel函数的结果: 首先看看INDERECT函数的定义:返回字符串所指定的索引 比如: 有了这个函数,解决当前问题的思路就是在竖向拖动的时候,能对应到INDIRECT("A1"),INDIRECT("B1"),INDIRECT("C1&q

SQL中PIVOT 行列转换

SQL中PIVOT 行列转换 本文导读:T-SQL语句中,Pivot运算符用于在列和行之间对数据进行旋转或透视转换,PIVOT命令可以实现数据表的列转行,同时执行聚合运算,UNPIVOT则与其相反,实现数据的行转列. PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合.UNPIVOT与PIVOT执行相反的操作,将表值表达式的列转换为列值. 通俗简单的说:PIVOT就是行转列,UNPIVOT就是列传行 一.PIVOT实例 1

T-SQL PIVOT 行列转换

前面几个例子: http://www.cnblogs.com/insus/articles/1969896.html http://www.cnblogs.com/insus/articles/1970577.html http://www.cnblogs.com/insus/articles/1970707.html 全是SQL Server行列转换或是列行转换的相关例子.不过在SQL Server2005版本开始,有一个新的函数PIVOT()可以很轻易实现这些功能.参考下面代码: SELEC

Excel-怎样实现行列转置

有时候,我们为了某些需要,必须把工作表的行列进行转置的方式显示.重新输入很浪费时间,怎样简单的实现转置呢,强大的excel2007提供了此项功能,具体怎么做,下面看我来演示一下. 工具/原料 装有excel2007的电脑一台 步骤/方法 如图所示,选中要进行行列转置的单元格区域.   选择"开始"选项卡,在"剪贴板"组中单击"复制"图标. 步骤阅读   在工作表中选中目标粘贴区域的左上角单元格.如图所示.   单击"剪贴板"组

pivot 与 unpivot 函数是SQL05新提供的2个函数

pivot 与 unpivot 函数是SQL05新提供的2个函数   ------------------------------------------------------------------------------ pivot函数: create table test(id int,name varchar(20),quarter int,profile int)insert into test values(1,'a',1,1000)insert into test values(

pivot 与 unpivot函数

pivot 与 unpivot函数pivot 与 unpivot 函数是SQL05新提供的2个函数 灰常灰常的实用 ------------------------------------------------------------------------------ pivot函数: create table test(id int,name varchar(20),quarter int,profile int)insert into test values(1,'a',1,1000)i

使用pivot和聚合函数将表中的行的值转为列产生新的表

原表格:V_ChannelReward结构为: select * from V_ChannelReward pivot (max(RewardSum) for RewardItem in ([星级奖励],[自建空充酬金],[首充酬金],[BOSS待办酬金],[激活酬金],[神州行上网套餐拓展酬金],[其他],[新增客户与裸机捆绑销售],[实名登记酬金],[宽带业务酬金],[2G渠道体系酬金],[3G渠道体系酬金],[数据业务酬金],[开户激励酬金],[开户基础酬金],[在网酬金],[维系酬金],