说下查询动作 Pivot
上一篇说了一下查询5步走~然后就几天_(:з」∠)_ ~今天继续说一下其中 表里面操作符里面的 Pivot ~
Pivot 在实现行转列的时候灰常有用。通常一个例子
CREATE TABLE #Tbl (Emp VARCHAR(50), [WeekDay] VARCHAR(50),LoginTime TIME) INSERT INTO #Tbl
( Emp, WeekDay, LoginTime )
VALUES ( 'Mart','Mon','09:00'),( 'Mart','TUE','08:55'),( 'Mart','Wed','09:02'),( 'Mart','Thu','08:50'),
( 'Ken','Mon','09:00'),( 'Ken','TUE','08:53'),( 'Ken','Wed','09:03'),( 'Ken','Thu','08:51'),
( 'Reach','Mon','09:00'),( 'Reach','TUE','08:51'),( 'Reach','Wed','09:04'),( 'Reach','Thu','08:57') SELECT
*
FROM #Tbl PIVOT(MIN(LoginTime) FOR [WeekDay] IN ([Mon],[Tue],[Wed],[Thu])) AS a Emp Mon Tue Wed Thu
-------------------------------------------------- ---------------- ---------------- ---------------- ----------------
Ken 09:00:00.0000000 08:53:00.0000000 09:03:00.0000000 08:51:00.0000000
Mart 09:00:00.0000000 08:55:00.0000000 09:02:00.0000000 08:50:00.0000000
Reach 09:00:00.0000000 08:51:00.0000000 09:04:00.0000000 08:57:00.0000000
这样简单就搞掂了一个行转列。
其实在这个步骤里面,Pivot 运算符就干了3件事~
1、分组:首先 Pivot 会将里面没有被提及的字段,在我的这个例子里面,就是将 Emp 加上 For 里面提及的 WeekDay 来分组。当然,这一步是不会影响到外部的Group by 语句的, 因为Povit 仅仅相当于 from 里面的一个运算,生成一个输入表,提供给下一步操作使用而已
(想象状态,这是经过步骤1 得出的虚拟表)
Emp WeekDay LoginTime
-------------------------------------------------- -------------------------------------------------- ----------------
Ken Mon 09:00:00.0000000
Mart Mon 09:00:00.0000000
Reach Mon 09:00:00.0000000
Ken Thu 08:51:00.0000000
Mart Thu 08:50:00.0000000
Reach Thu 08:57:00.0000000
Ken TUE 08:53:00.0000000
Mart TUE 08:55:00.0000000
Reach TUE 08:51:00.0000000
Ken Wed 09:03:00.0000000
Mart Wed 09:02:00.0000000
Reach Wed 09:04:00.0000000
有没有很熟悉,其实跟这句查询语句得出的结果一样
SELECT a.Emp,a.WeekDay,MIN(a.LoginTime) AS LoginTime
FROM #Tbl a
GROUP BY a.Emp,a.WeekDay
2、扩展:分组完成。之后,需要将 In () 包含的字段扩展出来。在这个例子里面就是要扩充到 'Mon','Tue','Wed','Thu' 这4个位置。要对于指定的列,才聚合数值,否则则为 Null.
MIN(CASE WHEN a.WeekDay = 'Mon' THEN a.LoginTime ELSE NULL END) AS [Mon],
MIN(CASE WHEN a.WeekDay = 'Tue' THEN a.LoginTime ELSE NULL END) AS [Tue],
MIN(CASE WHEN a.WeekDay = 'Wed' THEN a.LoginTime ELSE NULL END) AS [Wed],
MIN(CASE WHEN a.WeekDay = 'Thu' THEN a.LoginTime ELSE NULL END) AS [Thu]
当然罗 Min 这个运算符,是跟Pivot 里面输入的操作符一致的~
3、 聚合。有了第二步,聚合个结果列就OK了。就得出我们上面的结果~
以上~
参考 :<Sql server 2008 技术内幕 查询>
说下查询动作 Pivot的更多相关文章
- oracle下查询的sql已经超出IIS响应时间
		
场景: 最近一直发生oracle下查询的sql已经超出IIS响应时间,但是后台DB的SQL查询还未终止,一直在查询.这对DB是造成很大的压力. 解决办法 增加OracleCommand 中的Comma ...
 - linux下查询进程占用的内存方法总结
		
linux下查询进程占用的内存方法总结,假设现在有一个「php-cgi」的进程 ,进程id为「25282」.现在想要查询该进程占用的内存大小.linux命令行下有很多的工具进行查看,现总结常见的几种方 ...
 - 几种在Linux下查询外网IP的办法。
		
几种在Linux下查询外网IP的办法. Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl curlmyip.com curl ip.ap ...
 - Linux下查询一个包是32位还是64位
		
Linux下查询一个包是32位还是64位 [root@localhost ~]# rpm -qa --queryformat %-{name}-%{version}-%{release}-%{arc ...
 - mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功
		
mysql 控制台环境下查询中文数据乱码,插入.更新中文数据不成功 登录mysql密码是加入编码参数--default-character-set,中文用gbk mysql -uroo ...
 - Centos7下查询jdk安装路径
		
今天一个小实验需要安装jdk,用命令java -version查询了一下,原来Centos7自带OpenJDK的环境,但是需要手动配置/etc/profile文件,于是开始找java的安装路径.... ...
 - dblink嵌套场景下  查询出现:ORACLE ORA-00600错误的解决
		
前段时间在做oracle查询的时候遇到了一个非常奇怪的现象,现将现象和解决过程记录下来,以备查看: 环境描述:A数据库通过dblink访问B数据库的视图,B数据库的视图的数据是通过B的dblink连接 ...
 - 复杂sql分组查询 ( pivot)
		
一个数据表里面字段有年.月.日.金额.支付方式等字段,然后现在想写个sql语句,把每一天的每种支付方式金额(支付方式有多重)排在同一行, 最后在增加一列小计当前的所有支付方式的金额.如下图: 原sql ...
 - linux下查询域名或IP注册信息的操作记录(whois)
		
在运维工作中,有时需要查询某些域名的注册信息(域名的NS,注册用户,注册邮箱等),可以使用whois这个命令.whois命令令用来查找并显示指定帐号(或域名)的用户相关信息,因为它是到Network ...
 
随机推荐
- 基于TCP和多线程实现无线鼠标键盘-InputMethodManager
			
为了实现无线键盘的功能,使用了InputMethodManager弹出软键盘. // 弹出软键盘 public void pop_keyboard(){ imm = (InputMethodManag ...
 - spring 使用redis集群配置
			
上面两篇介绍了redis集群的配置合一些基本的概念,所以接下来当然是要在项目中使用咯,redis的java支持已经做的非常好了,所以我们来试着使用这些api来进行redis的操作,首先我们需要操作re ...
 - java servlet手机app访问接口(四)推送
			
一. 服务端DEMO下载及运行. 登录友盟后,浏览器直接输入下面这个URL,直接进入文档开发和DEMO下载页面:http://dev.umeng.com/push/ios/integration(下面 ...
 - SQL简单语句总结习题
			
创建一个表记员工个人信息: --创建一个表 create table plspl_company_info( empno ) not null, ename ) not null, job ), ma ...
 - 为mongodb数据库添加安全账户
			
最近的数据库服务器有些不稳定,遇到了黑客的骚扰,mongodb的安全存在一些漏洞.首要任务是给数据库添加账号.之前大家都习惯于mongodb的不加安全账号和密码来连接数据库,那么问题是添加了安全账户后 ...
 - CentOS6.5下安装PostgreSQL
			
一.配置 YUM 仓库 修改原始的 yum 仓库配置: vim /etc/yum.repos.d/CentOS-Base.repo 在[base]和[updates] 节(section)部分的尾部插 ...
 - .net字符串数组查找方式效率比较
			
下面是代码: static void Main(string[] args) { string[] arr = new string[] { "AAA", "BBBB&q ...
 - 我开发 wangEditor-mobile 的故事
			
wangEditor-mobile 是一款适用于手机.手指操作的富文本编辑器,wangEditor-mobile 官网 1. 写在前面 其实,我一开始并没有想做什么手机端操作的富文本编辑器. w ...
 - Ajax+PHP+MySQL 登陆示例
			
PHP是一门很好的语言,可以很方便的开发web应用程序,下面介绍一下PHP如何通过AJAX方式实现登录功能: 1 login.php 登录界面中,javascript脚本用ajax方式异步请求dolo ...
 - Oracle EBS Form 发布到Server端的注意事项
			
前段时间在本地XP系统上测试了一些整合javabean的Form例子,想着发布到服务器段去看看能否运行正常,一开始以为会和本地XP系统一样,部署到相关的目录下进行一些配置就可以了,但实际过程却和想象的 ...