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的更多相关文章

  1. Sql Server中不常用的表运算符之UNPIVOT

    在Sql Server中不常用的表运算符之PIVOT中,介绍了PIVOT表运算符,现在来说说与之相对应的另一个表运算符UNPIVOT. 从名字可以看出,这个运算符的作用与PIVOT刚好相反,是将一行的 ...

  2. Sql Server中不常用的表运算符之APPLY(2)

    在Sql Server中不常用的表运算符之APPLY(1)中提到,SQL2005中新支持的APPLY的特性:1.可以直接将表表达式(表值函数或者子查询)作为APPLY语句的右表连接左表.2.由于使用A ...

  3. Sql Server中不常用的表运算符之APPLY(1)

    写在这个系列的前面: 就像他们的名字一样,作为一个表运算,他们用来运算左表和右表.JOIN也是一个表运算符,不过他太常用了. APPLY: 将右表表达式应用在左表的每一行上. APPLY是Sql200 ...

  4. SQL Server中,常用的全局变量

    在SQL Server中,全局变量是一种特殊类型的变量,服务器将维护这些变量的值.全局变量以@@前缀开头,不必进行声明,它们属于系统定义的函数.下表就是SQL Server中一些常用的全局变量. 全局 ...

  5. SQL Server中查询数据库及表的信息语句

    /* -- 本文件主要是汇总了 Microsoft SQL Server 中有关数据库与表的相关信息查询语句. -- 下面的查询语句中一般给出两种查询方法, -- A方法访问系统表,适应于SQL 20 ...

  6. SQL Server中的临时表和表变量

    SQL Server中的临时表和表变量 作者:DrillChina出处:blog2008-07-08 10:05 在SQL Server的性能调优中,有一个不可比拟的问题:那就是如何在一段需要长时间的 ...

  7. sql Server中临时表与数据表的区别

    sql server 中临时表与数据表的区别 1.如何判断临时表和数据表已生成 --如何判断临时表是否已创建--- if exists(select * from tempdb..sysobjects ...

  8. 转:Sql Server中清空所有数据表中的记录

    如果要删除数据表中所有数据只要遍历一下数据库再删除就可以了,清除所有数据我们可以使用搜索出所有表名,构造为一条SQL语句进行清除了,这里我一一给各位同学介绍.   使用sql删除数据库中所有表是不难的 ...

  9. Sql Server中清空所有数据表中的记录

    Sql Server中清空所有数据表中的记录 清空所有数据表中的记录: 代码如下:exec sp_msforeachtable  @Command1 ='truncate table ?'删除所有数据 ...

随机推荐

  1. [转载]深入了解 Struts 1.1

    转载自:http://www.ibm.com/developerworks/cn/java/l-struts1-1/ 摘要:作为基于 MVC 模式的 Web 应用最经典框架,Struts 已经正式推出 ...

  2. Bandpass Signals(带通信号,或称窄带信号)

    带通信号 一个实的带通信号$x(t)$可以表示为 \[x(t) = r(t)\cos (2\pi f_0 t + \phi_x(t)) \] 其中$r(t)$是幅度调制或包络,$\phi_x(t)$是 ...

  3. Windows 查看端口占用和关闭进程

    支持原创地址 :http://www.cnblogs.com/moodlxs/p/4145384.html 开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PI ...

  4. 待研究:insert客商账户触发器增加条件提示为空

    增加客商时候重名不给保存,增加修改条件提示找不到

  5. 也说php从mysql数据库通过服务器端json返回数据出现乱码问题

    我最近需要用js和json与mysql数据库做一个两级联动的下拉菜单,发现当从数据库中返回的是中文时客户端会出现乱码问题,经过在百度上查找终于找到了解决办法如下: while($row=$MySqlc ...

  6. 关于margin的问题

    昨晚是第一天,现在来说说margin的这个存在的问题吧, 嗯,就是当你碰到 <div class="max-box"> <div class="box1 ...

  7. jquery的全选插件

    全选看起来挺简单的,要做得完美就不那么容易了. 目前,我的全选插件能做到以下6点: 1.点击全选checkbox,能将要选择的checkbox都选中.去掉全选按钮,能将所有的checkbox都不选.这 ...

  8. 国内常用DNS地址介绍

    1.谷歌全球通用DNS地址: 首选DNS地址:8.8.8.8 备选DNS地址:8.8.4.4 2.国内知名的114 DNS地址 首选DNS地址:114.114.114.114 备选DNS地址:114. ...

  9. Windows 特殊文件夹的位置

    发送到文件夹的位置 %APPDATA%\Microsoft\Windows\SendTo

  10. 利用MyEclipse自动生成POJO和配置文件

    1.选择MyEclipse菜单的window菜单的Open Perspective,选择MyEclipse Database Explorer,如图所示. 2.在MySql上面点击右键,选择eidt. ...