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 ...
随机推荐
- PHP,单双引号的区别‘“”“”’
一.转义 单引号:只转义\'和\\,其他不转义 双引号:都转义 二.变量解析 单引号:无法解析变量(原样输出) 双引号:可以解析变量 三.速度 单引号:更快 双引号:要分析是否有变量,转义内容更多 结 ...
- Commons JXPath - Object Graph Traversal
JXPath 提供了使用 Xpath 语法操纵符合 Java 类命名规范的 JavaBeans 的工具.也支持 maps.DOM 和其他对象模型.对于深层次结构的 JavaBean,使用 JXPath ...
- replace替换语句
t_sql语句:replace替换语句:update 表名 set 列名=REPLACE(列名,'替换的数据','替换后的数据')
- Android平台使用SQLite数据库存储数据
创建一个DataBaseHelper的类,这个类是继承SQLiteOpenHelper类的,这个类中包含创建数据库.打开数据库.创建表.添加数据和查询数据的方法.代码如下: package com.e ...
- SQL server 2008 安装问题解决
安装sqlserver2008 出现的一些问题解决方法 1,安装sqlserver的时候出现如下图所示,解决办法是:开始→运行→输入“regedit”→找到“HKEY_LOCAL_MACHINE\SY ...
- 补充:sql server 中的相关查询、case函数
相关查询(在同一个表中) 相关查询类似子查询,但是又不同于子查询:子查询中的子条件可以单独查出数据,但是相关查询的子条件不能查处数据.(可以理解成C#中for的穷举法,第一个for走一个,第二个for ...
- php递归方法实现无限分类实例
数组: 代码如下 复制代码 $items = array( array('id' => 1, 'pid' => 0, 'name' => '一级11' ), array('id' ...
- asp.net页面与页面之间传参数值
一.利用POST传值 传值asp文件send.aspx 代码如下 复制代码 <form id="form1" runat="server" action ...
- ASP.NET MVC 之控制器与视图之间的数据传递
今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...
- linux ubuntu vsftp 默认主目录
vi /etc/passwd 查看/ftp: 后面的目录就是默认目录 这是匿名用户的目录 --------------------------- 使用linux 别的用户,默认在/home/用户名 ...