sql之透视
1、透视原理:就是将查询结果进行转置
下面就举例来说明:
执行下面语句:检查是否含有表 dbo.Orders,如果有就将表删除:
if OBJECT_ID('dbo.Orders','U') is not null
drop table dbo.Orders
然后创建表dbo.Orders:
create table dbo.Orders
(
orderid int not null primary key,
empid int not null,
custid int not null,
orderdate datetime,
qty int
)
批量插入数据:
insert into dbo.Orders (orderid,orderdate,empid,custid,qty) values
(30001,'',3,1,10),
(10001,'',2,1,12),
(10005,'',1,2,20),
(40001,'',2,3,40),
(20001,'',2,2,12),
(10006,'',1,3,14),
(40005,'',3,1,10),
(20002,'',1,3,20),
(30003,'',2,2,15),
(30004,'',3,3,22),
(30007,'',3,4,30)
业务逻辑:查询出 每个 员工 处理的 每个客户的 订单总数
普通的查询方式:
select
empid,custid,SUM(qty) as sumqty
from Orders
group by empid,custid
order by empid
查询结果:
但是现在想要的结果是:
其中的A、B、C分别代表三个 客户Id,需要将原来的结果进行转置。
实现上面的结果就是sql里面的透视:
三个步骤:
1、将结果数据进行分组
2、将结果数据进行扩展
3、将结果数据进行聚合
第一种是实现方式:复杂、简单易懂的方式:使用相关子查询:
select
empid,
--下面是相关子查询,不是表的连接
(
select
SUM(qty)
from Orders as innerO
where innerO.empid=outerO.empid and custid=1
group by innerO.empid
) as A ,
(
select
SUM(qty)
from Orders as innerO
where innerO.empid=outerO.empid and custid=2
group by innerO.empid
) as B ,
(
select
SUM(qty)
from Orders as innerO
where innerO.empid=outerO.empid and custid=3
group by innerO.empid
) as C
from Orders as outerO
group by empid
第二种实现方式:使用组函数的特殊用法:
--简单方式 :使用sum()函数的特殊用法:在方法里面,添加 case语句
select
empid,
SUM(case when custid=1 then qty end) as A,--这样 将已经对empid 进行了限制
SUM(case when custid=2 then qty end) as B,
SUM(case when custid=3 then qty end) as C,
SUM(qty) as sumqty
from Orders
group by empid
第三种方式:使用pivot,是 sql server 特有的,在oracle里面没有:
select
empid,[],[],[]
from
(
--仅仅查询出 在 透视 里面需要用到的数据
select
empid,custid,qty
from Orders
) as t --在这里已经对数据 进行了分组
pivot
(
sum(qty) --聚合函数 (对那个列 执行 组函数)
for custid in ([],[],[])-- (对那些数据进行了聚合运算) 这里的数字一定要 加[]因为
) as p
这种 使用 sql server 里面内置的 pivot 的方法,肯定是比上面两种自己写的方法的效率高。
sql之透视的更多相关文章
- SQL数据透视
透视是一种通过聚合和旋转把数据行转换成数据列的技术.当透视数据时,需要确定三个要素:要在行(分组元素)中看到的元素,要在列(扩展元素)上看到的元素,要在数据部分看到的元素(聚合元素). SQL Ser ...
- SQL SERVER技术内幕之7 透视与逆透视
1.透视转换 透视数据(pivoting)是一种把数据从行的状态旋转为列的状态的处理,在这个过程中可能须要对值进行聚合. 每个透视转换将涉及三个逻辑处理阶段,每个阶段都有相关的元素:分组阶段处理相关的 ...
- [置顶] 图书推荐:SQL Server 2012 T-SQL基础 Itzik Ben-Gan
经过近三个月的不懈努力,终于翻译完毕了.图书虽然是基础知识,但是,即使你已经使用T-SQL几年,很多地方还是能够弥补你的知识空白.大师级的人物写基础知识,或许你想知道这基础中还有哪些深奥,敬请期待吧. ...
- PIVOT(透视转换)和UNPIVOT(逆透视转换)
一.原数据状态 二.手动写透视转换1 三.手动写透视转换2 四.PIVOT(透视转换)和UNPIVOT(逆透视转换)详细使用 使用标准SQL进行透视转换和逆视转换 --行列转换 create tabl ...
- 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)
索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 五.透视.逆透视及分组 5.1 透视 所谓透视( ...
- 你真的会玩SQL吗?透视转换的艺术
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- SQL pivot 基本用法 行列转换 数据透视
SQL通过pivot进行行列转换 数据透视 可直接在sql server 运行 传统操作 和 pivot create table XKCl (name nchar(10) not null, 学科 ...
- 微软BI 之SSIS 系列 - 在 SQL 和 SSIS 中实现行转列的 PIVOT 透视操作
开篇介绍 记得笔者在 2006年左右刚开始学习 SQL Server 2000 的时候,遇到一个面试题就是行转列,列转行的操作,当时写了很长时间的 SQL 语句最终还是以失败而告终.后来即使能写出来, ...
- 通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)
在mssql中大家都知道可以使用pivot来统计数据,实现像excel的透视表功能 一.MSsqlserver中我们通常的用法 1.Sqlserver数据库测试 ---创建测试表 Create tab ...
随机推荐
- 关于Eclipse的Save时的自定义操作
Eclipse中Save+S的时候会包含很多其他操作.例如代码格式化,自动导入或者删除jar包等等. 如果修改代码的时候不想让Eclipse做这些操作,有两种方法. 第一: 用一个文本编辑器打开这个文 ...
- 转 oracle 11g 导出空表
1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出. 2.设置deferred_segment_creation 参数为FALSE后,无论是 ...
- link与@import区别
1. link属于XHTML标签,@import是css提供的. 2.link在页面加载时加载,@import引用的css等到页面被加载完加载. 3.@import只在IE5以上可用,link无兼容问 ...
- Linux 命令 - arp: 操作系统的 ARP 缓存
arp 命令可以查看 ARP 缓存或者手动添加.删除缓存中的条目. 命令格式 arp [-evn] [-H type] [-i if] -a [hostname] arp [-v] [-i if] - ...
- SQL Server的三种物理连接之Loop Join(一)
Sql Server有三种物理连接Loop Join,Merge Join,Hash Join, 当表之间连接的时候会选择其中之一,不同的连接产生的性能不同,理解这三种物理连接对性能调优有很大帮助. ...
- DOS批处理命令-pause
“pause”用于暂停批处理的执行器并给出提示信息,然后由用户决定是继续执行还是终端执行. 语法: pause 简单一个pause,不附带任何参数. 执行pause以后会提示一句话[按任意键继续执行] ...
- TCP/IP——内外网IP+子网掩码作用+PING(网络总结)
目录: 1.如何区分内网IP和外网IP? 保留字段 2.子网掩码是起什么作用的? 将DNS和IP异或,表示哪段起作用 3.ping到底起什么作用? ping本地.ping远程 下面针对上面三个问题分别 ...
- ASP.NET中页面加载时文本框(texbox控件)内有文字获得焦点时文字消失
代码如下: <asp:TextBox ID="TextBox1" runat="server" Height="26px" MaxLe ...
- asp.net select Case条件语句的使用方法
原文:http://www.111cn.net/net/vb-net/38548.htm 如果 testexpression 与任何 Case expressionlist 表达式匹配 ,则执行此 C ...
- js 比较两个日期的大小的例子
例子,直接比较大小即可 代码如下 复制代码 <script>var st="2009-10-20 14:38:40"var et="2009-10-20 15 ...