PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。 PIVOT 提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单和更具可读性。

在我们进行复杂的查询统计的时候,特别是销售统计、处理大量数据的时候,PIVOT的作用就显得非常突出。

案例分析:在开发一个收集客户资源的小型系统时,需要对客户的资源进行查询统计,本来想用原来的统计解决方案,但是哥们提出了使用Pivot函数,这个我还真没用过,所以就针对这个函数进行了一些学习。

每一个客户资源通过不同的渠道进来,需要公司成员对用户的信息进行处理,回访、邮件之类的,所以客户信息的状态需要修改,而且需要对每一种状态的客户信息进行统计。如果按照旧的逻辑,采用简单的Count语句去查询统计,SQL语句如下:

select S.F_status,count(S.F_ID)as F_Count from c2c.dbo.T_Spread_customer as S group by S.F_status

你得到的结果类似于:

F_status  F_Count
----------- -----------
NULL        4
1            1
4            2
5            1
6            5
7            1

如果是查询整个数据表的统计信息,或许这样做也不是很麻烦,只需要遍历你得到的表,取出数据,然后匹配到某一状态就可以。但是,如果根据客户信息不同来源进行统计,显然这样做,局限性很大,我们没有办法一次性得到各个来源的统计信息。而采用PIVOT,你会得到如下的结果:

F_Num  F_Source F_Total  F_Normal  F_Crm F_Wait  F_InEffect  F_Effect
----------- ------- ----------- ----------- ----------- ----------- ----------- -----------
1            First          3          0              2          0          0          1
2          Second      3          0              0          1          0          2
3          Third          3          0              0          0          1          2
4          Forth        1            1              0          0          0          0
5          Other        0          0              0          0          0          0

它把原来一列的数据,变成了Table的一行数据,而我们要展示给用户的也是这样一张表,所以利用此函数可以节省大量的逻辑代码。方便、快捷、高效。

具体的SQL语句如下:

select * from ( select S.F_status,count(S.F_ID)as F_Count from c2c.dbo.T_Spread_customer as S group by S.F_status )As T PIVOT(sum(T.F_Count) for T.F_Status in([1],[4],[5],[6],[7])) as C

在这里,对其显示进行一些加工和判定:

加工后的SQL语句

select F_PsnID,isnull([1],0)+isnull([4],0)+isnull([5],0)+isnull([6],0)+isnull([7],0) as 'F_Total',isnull([1],0) as 'F_Normal', isnull([4],0) as 'F_NormalCrm',isnull([5],0) as 'F_Wait',isnull([7],0) as 'F_InEffect',isnull([6],0) as 'F_Effect' from ( select S.F_PsnID,S.F_status,count(S.F_ID)as F_Count from c2c.dbo.T_Spread_customer as S where (1=1) group by S.F_PsnID,S.F_status )As T PIVOT(sum(T.F_Count) for T.F_Status in([1],[4],[5],[6],[7])) as C order by F_Total desc

当然这只是个简单的小例子,你可以使用PIVOT,然后进行加工处理,它可以实现更为强大的功能。我在应用的时候用到了加入了临时表、分页等功能。

UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值。但是在实际应用中,有些聚合之后的数据很难进行拆分。所以呢,UNPIVOT并非PIVOT的逆过程。

建议:如果你想了解的更加清楚,请参考:http://technet.microsoft.com/zh-cn/library/ms177410.aspx
注意:对升级到 SQL Server 2005 或更高版本的数据库使用 PIVOT 和 UNPIVOT 时,必须将数据库的兼容级别设置为 90 或更高。

有的SQL Server 2005初始安装时,默认的兼容级别为“80”,这时我们需要将兼容级别进行设置,不然,PIVOT不能正常的执行。我在使用PIVOT时就遇到这样的问题。

具体的修改方案如下:

修改兼容级别步骤
1、连接到相应的 SQL Server 数据库引擎实例之后,在对象资源管理器中,单击服务器名称以展开服务器树。

2、展开“数据库”,然后根据数据库的不同,选择用户数据库,或展开“系统数据库”,再选择系统数据库。

3、右键单击数据库,再单击“属性”。

“数据库属性”对话框将打开。

4、在“选择页”窗格中,单击“选项”。

当前兼容级别显示在“兼容级别”列表框中。

5、若要更改兼容级别,请从列表中选择其他选项。 可用选项包括 SQL Server 2000 (80)、SQL Server 2005 (90) 或 SQL Server 2008 (100)。
具体的兼容级别之间的差异请参考:http://technet.microsoft.com/zh-cn/library/bb510680.aspx

相关链接:http://www.pin5i.com/showtopic-20128.html

PIVOT 用法详解相关推荐

  1. python argv 详解_Python3 sys.argv[ ]用法详解

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...

  2. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  3. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  4. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  5. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  6. php theme_path,PHP_Yii2主题(Theme)用法详解,本文实例讲述了Yii2主题(Theme) - phpStudy

    Yii2主题(Theme)用法详解 本文实例讲述了Yii2主题(Theme)用法.分享给大家供大家参考,具体如下: 首先看看主要的配置方式: 'components' => [ 'view' = ...

  7. LayoutInflater的inflate函数用法详解

    LayoutInflater的inflate函数用法详解 LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 获取LayoutInflater的方法有如下三种: ...

  8. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...

  9. WinDbg用法详解

    WinDbg用法详解 对WinDbg的方方面面作了详细的讲解. 转载于:https://blog.51cto.com/laokaddk/125111

最新文章

  1. php 补足字符串,php 数目字或者字符串补全
  2. WPF 3d坐标系和基本三角形
  3. SQL 经典回顾:JOIN 表连接操作不完全指南
  4. 科大星云诗社动态20210511
  5. 七、matplotlib的使用
  6. C#中的Dictionary字典类介绍(转载)
  7. linux压缩和解压缩命令汇总
  8. 保持windows2003域控制器的安全
  9. Confluence 6 为站点禁用匿名用户访问
  10. 如何开发自己的股票软件105
  11. 以WBS模板和PBS自动生成WBS计划任务
  12. fmpeg分析视频gop的大小
  13. round函数几位小数c语言,Excel中利用round函数保留两位小数实例详解
  14. 移植Python3到TQ2440(一)
  15. 负数求余简单技巧(C语言)
  16. Pixel2Mesh-Tensorflow2
  17. 【ACM】kuangbin基础数论专题
  18. 架构师学习笔记(四)架构师线路之系统架构师企业架构师
  19. Android:ViewPager详解(异步网络加载图片,带图片缓存,并带导航小圆点)
  20. python快速实现NPV净现值计算

热门文章

  1. Pytorch实现mnist手写数字识别
  2. 悲观锁和乐观锁的区别及使用场景
  3. error: command ‘/usr/local/cuda-11.6/bin/nvcc‘ failed with exit code
  4. XBEE-PRO-SX快速上手
  5. windows杀死进程
  6. Python Tricks : Function Argument Unpacking
  7. 2022 版史上最全 Java 八股文,没有任何异议
  8. RF-SIM卡的多应用COS研究与设计
  9. Java对字母移动三位加密_4动手动脑,总结及凯撒加密
  10. 虚拟化技术发展与虚拟化体系结构