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

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

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

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

CodeselectS.F_status,count(S.F_ID)asF_Countfromc2c.dbo.T_Spread_customerasSgroupbyS.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(

selectS.F_status,count(S.F_ID)asF_Countfromc2c.dbo.T_Spread_customerasS

groupbyS.F_status

)AsT

PIVOT(sum(T.F_Count)forT.F_Statusin([1],[4],[5],[6],[7]))asC

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

加工后的SQL语句selectF_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(

selectS.F_PsnID,S.F_status,count(S.F_ID)asF_Countfromc2c.dbo.T_Spread_customerasS

where(1=1)

groupbyS.F_PsnID,S.F_status

)AsT

PIVOT(sum(T.F_Count)forT.F_Statusin([1],[4],[5],[6],[7]))asC

orderbyF_Totaldesc

当然这只是个简单的小例子,你可以使用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)。

如有不妥之处,请留言批评指正。

pivot position_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

  10. ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解

    一.自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField.UITextView与UIWebView.在这些控件的文字交互处进行长按手势可以在屏幕视图 ...

最新文章

  1. linux smb配置目录,linux基础---smb配置
  2. ModuleNotFoundError: No module named ‘pandas.rpy‘
  3. .Net Core扩展 SharpPlugs简单上手
  4. Android wear
  5. 运维工程师如果将web服务http专变为https
  6. scikit-learn决策树算法类库使用小结
  7. 她15岁中科大4门力学课满分无人能破,遭性别歧视无缘诺贝尔奖
  8. 蚂蚁金服开源 SOFAJRaft:生产级 Java Raft 算法库
  9. 1054. 求平均值
  10. Kendo UI grid 表格数据更新
  11. TrackMouseEvent 与_TrackMouseEvent
  12. 访问控制列表——ACL
  13. 错过“复联4”在所不惜,迅雷链技术沙龙北京站有哪些更精彩的地方?
  14. 成功=正确的方法+艰苦的努力+少说空话——《学习之道》+《刻意练习》+《练习的心态》
  15. 腾讯云十亿级 Node.js 网关的架构设计与工程实践
  16. 网络安全 顶级进行鱼叉式钓鱼攻击?手把手教学
  17. scanf(“%*[\n]%[^\n]“,s)是什么意思?
  18. 在OpenCV里实现游戏外挂的位置识别
  19. 计算机毕业设计java+jsp鲜花销售商城信息网站(源码+系统+mysql数据库+Lw文档)
  20. JZOJ-senior-5952. 【NOIP2018模拟11.5A组】凯旋而归

热门文章

  1. The essentiality for Close-Out The Project
  2. linux 编写脚本按小时删除日志
  3. pages与页面配置
  4. 通过JS语句判断WEB网站的访问端是电脑还是手机
  5. ORACLE RESOURCE MANAGER(资源管理器)
  6. 搞笑又雷人的个人签名
  7. arm linux内核启动过程详解
  8. python最小值最大化和最大值最小化_OJ 21658::Monthly Expense(二分搜索+最小化最大值)...
  9. Wireshark实战分析之IP协议(一)
  10. Android 存储学习之SQLite数据库的基本操作