Sql Server中不常用的表运算符之PIVOT
PIVOT是SQL Server2005新添加的一个表运算符,作用在于将行转为列。
先来看看他的基本语法:
来自http://technet.microsoft.com/zh-cn/library/ms177410(v=sql.105).aspx
SELECT <非透视的列>,
[第一个透视的列] AS <列名称>,
[第二个透视的列] AS <列名称>,
...
[最后一个透视的列] AS <列名称>,
FROM
(<生成数据的 SELECT 查询>)
AS <源查询的别名>
PIVOT
(
<聚合函数>(<要聚合的列>)
FOR
[<包含要成为列标题的值的列>]
IN ( [第一个透视的列], [第二个透视的列],
... [最后一个透视的列])
) AS <透视表的别名>
<可选的 ORDER BY 子句>;
看到这一坨,我已经晕了,所以还是用一个实际的列子来理解。
假设有如下order表

下面这个查询将返回不同城市,地区的消费者的订单数
SELECT
City,--可选非透视列
Region,--可选非透视列
C001,--透视列
C002,--透视列
C003--透视列
FROM
(
SELECT
City,
Region,
CustomId,
OrderId
FROM dbo.[Order]
)AS OrderTable--源表
PIVOT (
COUNT(--聚合函数
OrderID--要聚合的列
)
FOR CustomId--要成为标题值的列
IN(
[C001],--透视列
[C002],--透视列
[C003]--透视列
)
)
AS PivoTTable
ORDER BY City DESC--可选Order by
结果如下

PIVOT将按一下三个步骤处理源表
1.隐式分组
源表中选出了四列,其中的两列作为PIVOT的输入参数:OrderID--要聚合的列,CustomId--要成为标题值的列
剩下的两列将作为源表的隐式分组,源表查询将会转换为如下查询
SELECT
City,
Region,
OrderID,
CustomID
FROM dbo.[Order]
GROUP BY City,Region
此时这个查询无法通过编译,因为我们还没有对OrderID和CustomID进行聚合操作。
2.隔离值
这个阶段将对透视列进行隔离,类似于下面的操作
SELECT
City,
Region,
CASE WHEN CustomId ='C001' THEN OrderId END AS C001,
CASE WHEN CustomId ='C002' THEN OrderId END AS C002,
CASE WHEN CustomId ='C003' THEN OrderId END AS C003
FROM dbo.[Order]
GROUP BY City,Region
3.对每个CASE表达式进行聚合操作,得到最终查询
SELECT
City,
Region,
COUNT(CASE WHEN CustomId ='C001' THEN OrderId END) AS C001,
COUNT(CASE WHEN CustomId ='C002' THEN OrderId END) AS C002,
COUNT(CASE WHEN CustomId ='C003' THEN OrderId END) AS C003
FROM dbo.[Order]
GROUP BY City,Region
ORDER BY City DESC--可选的排序操作
最后执行上面这个查询,将得到与使用PIVOT一样的透视结果。
而隐式分组的列的行值将作为透视行连同透视列一起组成透视表。
Sql Server中不常用的表运算符之PIVOT的更多相关文章
- Sql Server中不常用的表运算符之UNPIVOT
在Sql Server中不常用的表运算符之PIVOT中,介绍了PIVOT表运算符,现在来说说与之相对应的另一个表运算符UNPIVOT. 从名字可以看出,这个运算符的作用与PIVOT刚好相反,是将一行的 ...
- Sql Server中不常用的表运算符之APPLY(2)
在Sql Server中不常用的表运算符之APPLY(1)中提到,SQL2005中新支持的APPLY的特性:1.可以直接将表表达式(表值函数或者子查询)作为APPLY语句的右表连接左表.2.由于使用A ...
- Sql Server中不常用的表运算符之APPLY(1)
写在这个系列的前面: 就像他们的名字一样,作为一个表运算,他们用来运算左表和右表.JOIN也是一个表运算符,不过他太常用了. APPLY: 将右表表达式应用在左表的每一行上. APPLY是Sql200 ...
- SQL Server中,常用的全局变量
在SQL Server中,全局变量是一种特殊类型的变量,服务器将维护这些变量的值.全局变量以@@前缀开头,不必进行声明,它们属于系统定义的函数.下表就是SQL Server中一些常用的全局变量. 全局 ...
- SQL Server中查询数据库及表的信息语句
/* -- 本文件主要是汇总了 Microsoft SQL Server 中有关数据库与表的相关信息查询语句. -- 下面的查询语句中一般给出两种查询方法, -- A方法访问系统表,适应于SQL 20 ...
- SQL Server中的临时表和表变量
SQL Server中的临时表和表变量 作者:DrillChina出处:blog2008-07-08 10:05 在SQL Server的性能调优中,有一个不可比拟的问题:那就是如何在一段需要长时间的 ...
- sql Server中临时表与数据表的区别
sql server 中临时表与数据表的区别 1.如何判断临时表和数据表已生成 --如何判断临时表是否已创建--- if exists(select * from tempdb..sysobjects ...
- 转:Sql Server中清空所有数据表中的记录
如果要删除数据表中所有数据只要遍历一下数据库再删除就可以了,清除所有数据我们可以使用搜索出所有表名,构造为一条SQL语句进行清除了,这里我一一给各位同学介绍. 使用sql删除数据库中所有表是不难的 ...
- Sql Server中清空所有数据表中的记录
Sql Server中清空所有数据表中的记录 清空所有数据表中的记录: 代码如下:exec sp_msforeachtable @Command1 ='truncate table ?'删除所有数据 ...
随机推荐
- [转载]给IT人员支招:如何跟业务部门谈需求分析?
一提跟业务人员做“需求分析”,许多IT人员立刻就头大了,要么不在同一个“频道”讲话,要么“变来变去,定不下来”.如何跟业务部门谈需求分析呢,我们带着这个问题,与聚冠因尚的咨询顾问杨春波展开了讨论. 1 ...
- Python IDE PyCharm的基本快捷键和配置简介
快捷键 1.编辑(Editing)Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + Space 快速导入任意类Ctrl + Shift + Enter 语句完成Ctr ...
- Java三大主流框架概述
Struts.Hibernate和Spring是我们Java开发中的常用关键,他们分别针对不同的应用场景给出最合适的解决方案.但你是否知道,这些知名框架最初是怎样产生的? 我们知道,传统的Java W ...
- C++中三种new的用法
转载自:http://news.ccidnet.com/art/32855/20100713/2114025_1.html 作者: mt 1 new operator,也叫new表达式:new表达式比 ...
- 转:C# 中 MSCHART 饼状图显示百分比
转自:http://blog.sina.com.cn/s/blog_51beaf0e0100yffo.html 1)显示百分比 Chart1.Series["Series1"].L ...
- 集成IC刷卡器经验
因为一系列的原因,IC刷卡器要渐渐地取代磁条刷卡器.公司在这方面也是需要跟进的,在我负责集成IC刷卡器到应用程序的过程中,积累了些经验,现在分享下. 第一:无论是磁条还是IC刷卡器都是刷卡器的一种,所 ...
- Python-10 字典
#1 创建 dict1={'欢欢':'i love','小高高':'you'} dict2={1:'one',2:'two',3:'three'} dict3={} #2 访问元素 print('欢欢 ...
- 删除sqlserver代理任务脚本
无法删除SQLSERVER代理任务时可用如下语句试验下 use [msdb] ) set @job_name = N'jobname' --注:job_name为维护计划对应的job name --删 ...
- java comet
http://www.javaworld.com/article/2077995/java-concurrency/asynchronous-processing-support-in-servlet ...
- 六十三、android pad
参照连接:http://blog.csdn.net/guolin_blog/article/details/8881711 http://www.xue5.com/Mobile/Android/708 ...