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 ?'删除所有数据 ...
随机推荐
- pl/sql配置连接远程数据库oracle,本地没有安装oracle数据库的情况下
首先下载instantclient 可以到oracle官网下载,要注册账号,一定要下对应版本的,要不然不成功, 10G,11G版的,我已经传上来了,免费下载:正在上传中,稍等 配置文件tnsnames ...
- PHP中include和require的区别详解
1.概要 require()语句的性能与include()相类似,都是包括并运行指定文件.不同之处在于:对include()语句来说,在执行文件时每次都要进行读取和评估:而对于require()来说, ...
- C++ 实现Range类,用于常规遍历
PYTHON的Range类非常好用,所以用C++来简单实现下: // 实现Range类,用于遍历 // #include <string> class Range { public: / ...
- nodejs express环境配置
下载安装最新版nodejs,安装完毕运行命令 node -v 查看版本以及是否安装成功. 然后安装express插件,命令 npm install -g express (全局) , express ...
- 【转】日期工具类DateUtils
转自csdn,原作者:jzhf2012 package date.util; import java.text.ParseException; import java.text.SimpleDateF ...
- source tree 推送错误解决
fatal: The remote end hung up unexpectedly 出现这个问题是因为文件过大 解决办法: 打开git bash 输入git config --global http ...
- Visual Studio 2012 trial version
Update: vs2012.5.iso http://download.microsoft.com/download/9/F/1/9F1DEA0F-97CC-4CC4-9B4D-0DB45B8261 ...
- MySQL Workbench “Error Code: 1175” 的解决方法
转自:http://www.linuxidc.com/Linux/2012-04/59333.htm 当用MySQL Workbench进行数据库的批量更新时,执行一个语句会碰到以下错误提示: Err ...
- AOP是什么?
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...
- css狂记
接着上一篇 html狂记,同样是DIV+CSS传统站点开发,同样只是收集.整理... CSS 背景属性(Background) 属性 描述 CSS background 在一个声明中设置所有的背景属性 ...