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 ...
随机推荐
- 【转载】Java 9 新特性——模块化
来自 <http://www.jianshu.com/p/053a5ca89bbb#> 前言 年,我们将迎来 Java 语言的 22 岁生日,22岁,对于一个人而言,正是开始大展鸿图的年纪 ...
- Git、Github、码云 笔记汇总
从本地恢复码云的项目 把本地项目同步到码云 CBoard 基于0.4.1的旧版本的分支修改合并到0.4.2新版本里面 通过git命令行把一个分支的其中一个commit(提交)合并到另外一个分支里面去
- Java 子类父类构造方法执行顺序
public class Test { class Super { int flag = 1; Super() { test(); } void test() { System.out.println ...
- [意识流]简单易懂的AC自动机
为了一言不合就徒手敲AC自动机,决定看一下原理 于是花了一张图, 参考HDU2222的样例 于是看懂这张图的你很快就敲出了如下代码并且AC了 #include<bits/stdc++.h> ...
- idea 验证码
N757JE0KCT-eyJsaWNlbnNlSWQiOiJONzU3SkUwS0NUIiwibGljZW5zZWVOYW1lIjoid3UgYW5qdW4iLCJhc3NpZ25lZU5hbWUiO ...
- activity启动模式launchMode区别和优化
初学android的开发人员,可能会经常忽略这个重要的设置. Activity一共有以下四种launchMode:1.standard2.singleTop3.singleTask4.singleIn ...
- Acronis
关于这个神奇的东西也没少折腾了我,这里是它的家:http://www.acronis.com/zh-cn/ 网上也看了一些,没有头绪,总之给我的感觉就是不明觉厉.这里小结自己的学到的一些东西,算是一整 ...
- 新创建的数据库,执行db2look时,遇到package db2lkfun.bnd bind failed
在新创建的数据库中,执行db2look的时候,存在这样的问题 db2v97i1@oc0644314035 ~]$ db2look -d sample -e -l -o db2look.ddl -- N ...
- hibernate_boolean类型的处理
xml方式,直接写就行,hibernate会直接帮你生成: javaBean代码片段: private boolean leaf; public boolean isLeaf() { return l ...
- redis集群的搭建详细教程
1 Redis-cluster架构图 redis-cluster投票:容错 (至少要三个才可以,才能超过半数) 架构细节: (1)所有的redis节点彼此互联(PING-PO ...