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之透视的更多相关文章

  1. SQL数据透视

    透视是一种通过聚合和旋转把数据行转换成数据列的技术.当透视数据时,需要确定三个要素:要在行(分组元素)中看到的元素,要在列(扩展元素)上看到的元素,要在数据部分看到的元素(聚合元素). SQL Ser ...

  2. SQL SERVER技术内幕之7 透视与逆透视

    1.透视转换 透视数据(pivoting)是一种把数据从行的状态旋转为列的状态的处理,在这个过程中可能须要对值进行聚合. 每个透视转换将涉及三个逻辑处理阶段,每个阶段都有相关的元素:分组阶段处理相关的 ...

  3. [置顶] 图书推荐:SQL Server 2012 T-SQL基础 Itzik Ben-Gan

    经过近三个月的不懈努力,终于翻译完毕了.图书虽然是基础知识,但是,即使你已经使用T-SQL几年,很多地方还是能够弥补你的知识空白.大师级的人物写基础知识,或许你想知道这基础中还有哪些深奥,敬请期待吧. ...

  4. PIVOT(透视转换)和UNPIVOT(逆透视转换)

    一.原数据状态 二.手动写透视转换1 三.手动写透视转换2 四.PIVOT(透视转换)和UNPIVOT(逆透视转换)详细使用 使用标准SQL进行透视转换和逆视转换 --行列转换 create tabl ...

  5. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)

    索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 五.透视.逆透视及分组 5.1 透视 所谓透视( ...

  6. 你真的会玩SQL吗?透视转换的艺术

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  7. SQL pivot 基本用法 行列转换 数据透视

    SQL通过pivot进行行列转换 数据透视 可直接在sql server 运行 传统操作 和 pivot create table XKCl (name nchar(10) not null, 学科 ...

  8. 微软BI 之SSIS 系列 - 在 SQL 和 SSIS 中实现行转列的 PIVOT 透视操作

    开篇介绍 记得笔者在 2006年左右刚开始学习 SQL Server 2000 的时候,遇到一个面试题就是行转列,列转行的操作,当时写了很长时间的 SQL 语句最终还是以失败而告终.后来即使能写出来, ...

  9. 通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)

    在mssql中大家都知道可以使用pivot来统计数据,实现像excel的透视表功能 一.MSsqlserver中我们通常的用法 1.Sqlserver数据库测试 ---创建测试表 Create tab ...

随机推荐

  1. [改善Java代码]不使用stop方法停止线程

    线程启动完毕后,在运行可能需要终止,Java提供的终止方法只有一个stop,但是不建议使用此方法,因为它有以下三个问题: (1)stop方法是过时的 从Java编码规则来说,已经过时的方式不建议采用. ...

  2. linux进程间通信概述

    一个大型的应用系统,往往需要众多进程协作,进程间通信的重要性显而易见. 进程间通信有如下一些目的: 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间. 共享数据: ...

  3. poj 1185 炮兵阵地 状态压缩dp

    思路:定义一个三维数组dp[x][i][j]其中x为now和pre两种状态,now表示当前两行最优解,pre表示出了本行外,前两行的最优解.那么状态转移方程为 dp[now][j][k]=max(dp ...

  4. windows下编辑过的文件在Linux下用vi打开行尾会多出一个^M符号

    一般情况下,windows下编辑过的文件在Linux下用vi打开行尾会多出一个^M符号,如下图: 这是因为Windows等操作系统用的文本换行符和UNIX/Linux操作系统用的不同,Windows系 ...

  5. (原创)monitor Dell Powerconnec 6224 with cacti

    使用cacti监控DELL Powerconnect 6224,可以直接使用http://docs.cacti.net/usertemplate:host:dell:powerconnect:62xx ...

  6. 【转载】Apache Kafka:下一代分布式消息系统

    http://www.infoq.com/cn/articles/kafka-analysis-part-1 Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩 ...

  7. 自定义ListView适配器

    继承BaseAdapter类 覆盖以下4个方法: @Override public int getCount() { return users.size(); } @Override public O ...

  8. Script 代码段

    script代码段 1.script代码段的执行 在Javascript代码中,可以使用script作为基本标识,script代码段在运行过程中是分段解析与执行的. 2.script代码段执行流程 在 ...

  9. 关于在DWZ使用ssh后台查询的几种方式

    1.查询所有记录,并以列表形式查询 DaoImpl public PageBean queryByPage(String hql, List<Object> listobj, int pa ...

  10. Redis配置中文翻译,3.2.1版

    大部分常见设置都翻译了,还有一些是从网上复制的(懒) # Redis configuration file example. ## Redis配置文件示例 # # Note that in order ...