sql-pivot
PIVOT
PIVOT运算符用于在列和行之间进行数据旋转或透视转换,同时执行聚合运算
Select * From Sales.OrderValues Where YEAR(orderdate) In(2006,2007,2008) Order By empid asc

Select * From
(
Select empid,YEAR(orderdate) As OrderYear,val From Sales.OrderValues
) OV Pivot(Sum(val) For OrderYear In([],[],[])) P

返回每个雇员每年处理过的订单的总价格。在输出中,每个雇员占一行,每个订单年份占一列,每个雇员行和订单年份列的交叉位置上则是总价格。
PIVOT运算符用一个名为OV的表表达式作为它的左输入:每个订单占一行,包含雇员ID(empid)、订单年份(orderyear)和订单价格(val)。PIVOT操作涉及以下三个步骤:
1、P1:分组
2、P2:扩展
3、P3:聚合
从查询语句中看到PIVOT运算符引用了OV中的两个列作为输入参数(val和orderyear)。第一阶段会隐式地对OV的行进行分组,分组依据是那些未作为PIVOT输入的所有列,就像是有一个隐藏的Group By子句。在这个示例中只有empid列没有出现在PIVOT的输入参数中。所以每个雇员都将有一个组。
注意:
PIVOT的隐式分组阶段并不会影响查询中任何显式的GROUP BY子句。PIVOT运算最终会生成一个虚拟表,作为下一个逻辑阶段(也许是另一个表运算,也许是WHERE阶段)的输入。当查询中同时出现PIVOT和GROUP BY时,会有两个单独的分组阶段:一个是PIVOT的第一个阶段(P1),另一个是查询的GROUP BY阶段。
PIVOT的第二个阶段(P2)将<spreading_col>列表中的值扩展到它们相应的目标列上。在逻辑上,相当于为IN子句中指定的每个目标列使用一下CASE表达式:
CASE WHEN <spereading_col> = <target_col_element> THEN <expression> END
在这个例子中相当于应用了下面3个表达式:
CASE WHEN orderyear = 2006 THEN val END,
CASE WHEN orderyear = 2007 THEN val END,
CASE WHEN orderyear = 2008 THEN val END
注意:不带ELSE子句的CASE表达式相当于包含一个隐式的 ELSE NULL
对于每个目标列,只有来源行具有相应的订单年份时,CASE 表达式才会返回订单价格(val列),否则,CASE 表达式将返回 NULL
PIVOT 的第三个阶段(P3)对每个 CASE 表达式应用指定的聚合函数,该例中逻辑上等效的表达式应该是这样:
SUM(CASE WHEN orderyear = 2006 THEN val END) AS [2006],
SUM(CASE WHEN orderyear = 2007 THEN val END) AS [2007],
SUM(CASE WHEN orderyear = 2008 THEN val END) AS [2008]
前面的 PIVOT 查询逻辑上相当于以下查询:
Select empid,
SUM(CASE WHEN orderyear=2006 THEN val END) AS [],
SUM(CASE WHEN orderyear=2007 THEN val END) AS [],
SUM(CASE WHEN orderyear=2008 THEN val END) AS []
FROM (
SELECT empid,YEAR(orderdate) AS orderyear,val FROM Sales.OrderValues
) AS OV
GROUP BY empid
sql-pivot的更多相关文章
- sql pivot、unpivot和partition by用法
原文:sql pivot.unpivot和partition by用法 演示脚本 from sys.sysobjects where name = 'Student' AND type = 'U') ...
- SQL pivot 基本用法 行列转换 数据透视
SQL通过pivot进行行列转换 数据透视 可直接在sql server 运行 传统操作 和 pivot create table XKCl (name nchar(10) not null, 学科 ...
- Ms sql pivot unpivot
--建表 create table dbo.orders ( orderid int not null primary key nonclustered, orderdate datetime not ...
- sql pivot(行转列) 和unpivot(列转行)的用法
1.PIVOT用法(行转列) select * from Table_Score as a pivot (sum(score) for a.name in ([语文],[数学],[外语],[文综],[ ...
- MS SQL PIVOT数据透视表
以前曾经做过练习<T-SQL PIVOT 行列转换>https://www.cnblogs.com/insus/archive/2011/03/05/1971446.html 今天把拿出来 ...
- MSSQL—行转列
行转列,是SQL中经常会遇到的一个问题,并且分为静态转换和动态转换,所谓静态转换即在转换的行数已知或固定:动态转换则为转换的行数不固定. 转换的方法一般采用case when语句或pivot(MSSQ ...
- oracle琐碎笔记
Oracle知识点 ps:由于是自己看的所以笔记比较乱,大家谅解 Commit rollback Sql核心语句之select Selct中要用到以下语句 From语句 Where语句 Group b ...
- MSSQL—行转列
行转列,是SQL中经常会遇到的一个问题,并且分为静态转换和动态转换,所谓静态转换即在转换的行数已知或固定:动态转换则为转换的行数不固定. 转换的方法一般采用case when语句或pivot(MSSQ ...
- MSSQL行车列规则
行转列,是SQL中经常会遇到的一个问题,并且分为静态转换和动态转换,所谓静态转换即在转换的行数已知或固定:动态转换则为转换的行数不固定. 转换的方法一般采用case when语句或pivot(MSSQ ...
- SQL Server中行列转换 Pivot UnPivot
SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
随机推荐
- 51.RocketMQ 顺序消费
大部分的员工早上的心情可能不会很好,因为这时想到还有很多事情要做,压力会大点,一般到下午4点左右,状态会是一天中最好的,因为这时大部分的工作做得差不多了,又快要下班了,当然也不是绝对.要注意记录各下属 ...
- 对Routers的理解
路由Routers 对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息. REST framework提供 ...
- python 全栈开发:数据类型整体分析
数据类型初始 数据类型: int :用于计算. 例子:1.2.3.4........................... 常用方法操作: bit_length() ps:求一个数字转换成二 ...
- HLS:OpenCV和RTL代码转换关系
OpenCV 图像处理是基于存储器帧缓存而构建的, 它总是假设视频帧数据存放在外部 DDR 存储器中. 由于处理器的小容量高速缓存性能的限制, 因此, OpenCV 访问局部图像性能较差. 并且, 从 ...
- 【ZooKeeper】单机伪集群搭建(适用于mac)
1.配置 .zookeeper下载地址:http://apache.mirrors.lucidnetworks.net/zookeeper/ 可以选择需要的版本,我下载的是zookeeper-3.4. ...
- ACCESS 手工注入
ACCESS的注入,基本是死的.思路很简单,基本都可以工具解决.上代码: 1.判断有无注入点' and 1=1 and 1=22.猜表一般的表的名称无非是admin adminuser user pa ...
- Scanner类中的nextToken()方法解读
下面看一下nextToken()方法的源码实现. 1.Java中的控制字符 case ' ': // (Spec 3.6) case '\t': // (Spec 3.6) case FF: // ( ...
- guava学习:guava集合类型-table
最近学习了下guava的使用,这里简单记录下一些常用并且使用的工具类把. 看到table的使用时候真的是眼前一亮,之前的代码中写过很多的Map<String,Map<String,Stri ...
- python-FTP模块
#!/user/bin/python #coding=utf-8 import ftplib import os import socket HOST = 'ftp.kernel.org' DIRN ...
- apollo应用配置集成及使用
apollo应用配置集成及使用 1. 开发环境Apollo地址 用户名:apollo 密码:admin 开发环境Apollo管理台地址:http://localhost:8070/ ...