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. navicat连接My SQL时忘记root密码处理方法

    前端时间安装完My SQL5.6以后很长时间没用过,用navicat连接时有错误提示 应该是密码错误了,但是忘记了root的密码. 在网上找了很久,终于找到修改root密码的方法并修改成功. 1. 关 ...

  2. 用git管理自己读的书

    福昕阅读器,可以方便地做书签和备注.使用git去管理图书和示例代码,一方面能够很好地保存这些资料,方便查找:另外一方面,无论在家,还是在公司,都能很好地同步自己学习的进度. 福昕阅读器5(视图--&g ...

  3. Linux 目录配置

    一.Linux 目录配置标准:FHS FHS(Filessystem Hierarchy Standard) 的重点在于规范每个特定的目录下应该要放置什么样子的数据. FHS依据文件系统使用的频繁与否 ...

  4. 从感知器到SVM

    这篇文章主要是分析感知器和SVM处理分类问题的原理,不涉及求解 感知器: 感知器要解决的是这样的一个二分类问题:给定了一个线性可分的数据集,我们需要找到一个超平面,将该数据集分开.这个超平面的描述如下 ...

  5. Stanford NLP 学习笔记2:文本处理基础(text processing)

    I. 正则表达式(regular expression) 正则表达式是专门处理文本字符串的正式语言(这个是基础中的基础,就不再详细叙述,不了解的可以看这里). ^(在字符前): 负选择,匹配除括号以外 ...

  6. 【javascript进阶】异常

    前言 最近有些时间了,今天看了看博客的后台记录,好多都没有写博客呢,争取尽快把以前的补上,javascrit中的异常在前端大家用的好像不是很多,其实javascript的异常和大多数的后端语言差不大, ...

  7. socket listen参数中的backlog 的意义!

    服务器监听时,在每次处理一个客户端的连接时是需要一定时间的,这个时间非常的短(也许只有1ms 或者还不到),但这个时间还是存在的.而这个backlog 存在的意义就是:在这段时间里面除了第一个连接请求 ...

  8. X.509证书生成

    创建数字证书 用户对数字证书的认可决定于对证书颁发机构的信任,所以证书颁发机构决定了数字证书的可用范围.由于官方认可的数字证书颁发机构,比如VeriSign.Thawte(OpenSSL),具有普遍的 ...

  9. WEB打印控件Lodop

    主页 http://www.lodop.net/

  10. autoit 使用excel自带函数操作excel

    Looking into the includes <Excel.au3> helped shed some light on things. To summarize what I've ...