上一篇说了一下查询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的更多相关文章

  1. oracle下查询的sql已经超出IIS响应时间

    场景: 最近一直发生oracle下查询的sql已经超出IIS响应时间,但是后台DB的SQL查询还未终止,一直在查询.这对DB是造成很大的压力. 解决办法 增加OracleCommand 中的Comma ...

  2. linux下查询进程占用的内存方法总结

    linux下查询进程占用的内存方法总结,假设现在有一个「php-cgi」的进程 ,进程id为「25282」.现在想要查询该进程占用的内存大小.linux命令行下有很多的工具进行查看,现总结常见的几种方 ...

  3. 几种在Linux下查询外网IP的办法。

    几种在Linux下查询外网IP的办法.   Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl curlmyip.com curl ip.ap ...

  4. Linux下查询一个包是32位还是64位

    Linux下查询一个包是32位还是64位 [root@localhost ~]# rpm -qa  --queryformat %-{name}-%{version}-%{release}-%{arc ...

  5. mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功

    mysql 控制台环境下查询中文数据乱码,插入.更新中文数据不成功         登录mysql密码是加入编码参数--default-character-set,中文用gbk mysql -uroo ...

  6. Centos7下查询jdk安装路径

    今天一个小实验需要安装jdk,用命令java -version查询了一下,原来Centos7自带OpenJDK的环境,但是需要手动配置/etc/profile文件,于是开始找java的安装路径.... ...

  7. dblink嵌套场景下 查询出现:ORACLE ORA-00600错误的解决

    前段时间在做oracle查询的时候遇到了一个非常奇怪的现象,现将现象和解决过程记录下来,以备查看: 环境描述:A数据库通过dblink访问B数据库的视图,B数据库的视图的数据是通过B的dblink连接 ...

  8. 复杂sql分组查询 ( pivot)

    一个数据表里面字段有年.月.日.金额.支付方式等字段,然后现在想写个sql语句,把每一天的每种支付方式金额(支付方式有多重)排在同一行, 最后在增加一列小计当前的所有支付方式的金额.如下图: 原sql ...

  9. linux下查询域名或IP注册信息的操作记录(whois)

    在运维工作中,有时需要查询某些域名的注册信息(域名的NS,注册用户,注册邮箱等),可以使用whois这个命令.whois命令令用来查找并显示指定帐号(或域名)的用户相关信息,因为它是到Network ...

随机推荐

  1. 清除Windows的DNS缓存

    最近ESET杀毒软件老是提示受到DNS缓存攻击,然后就不能打开网页,或者打开得很慢.这是由于缓存的DNS被更改,访问的是错误的IP地址造成的. 解决的办法就是清除DNS缓存,打开DOS命令窗口,先后输 ...

  2. FireMonkey ListView 自动计算行高

    说明:展示 ListView 视其每一行 Item 的 Detail 字串长度自动调整高度(可每行高度不同). 适用:Delphi XE7 / XE8 源码下载:[原创]ListView_自动计算行高 ...

  3. 修正 Memo 設定為 ReadOnly 後, 無法有複製的功能

    问题:当 Memo 設定為 ReadOnly = True 後, 选取一段文字后,無法有複製的功能. 适用:XE6 Android 系统(目前 iOS 还找不到方法) 修正方法: 请将源码 FMX.P ...

  4. Hack语言类型化简介

    在typechecker的配合下,Hack语言的类型化能力是Hack其他功能特性的基石.开发Hack语言的主要动机也正是为代码提供显式类型标注以便对代码进行类型一致性和潜在错误分析. 这是用于对比Ha ...

  5. svn利用钩子实现代码同步到web目录

    思路:  找 到SVN Server中的仓库(Repositories)文件夹的位置,在相应的项目文件夹中找到hooks文件夹.在该文件夹中添加一个post- commit文件:当有commit动作发 ...

  6. Java经典实例:进阶版堆栈实现,支持任何对象类型

    支持任何对象类型,有更多的错误检查. package Stack; /** * Created by Frank */ public class MyStack<T> implements ...

  7. 简单的Writer和Reader

    Writer用于写出去到文件中,Reader用于将外面的文件读进来控制台 Writer和Reader有许多子类,但是子类大多都是直接运用父类Writer和Reader的方法,而且Writer和Read ...

  8. xshell 通过ssh连接 ubuntu15_x64

    参考: http://www.cnblogs.com/wuyuegb2312/archive/2013/03/28/2986963.html 中文乱码在客户端xshell解决:http://jingy ...

  9. 创业小坑:内网域名 在windows下能nslookup,但ping不通,也无法访问。而在linux下正常。

    使用巴法络(BUFFALO )LS-XL 网络硬盘盒开启了FTP服务,IP是172.16.0.21 在windows和linux上,都可以访问ftp://172.16.0.21,现在想使用域名访问,便 ...

  10. Ifvisible.js – 判断网页中的用户是闲置还是活动状态

    ifvisible.js 是一个跨浏览器.轻量级的方式,用户检查用户在浏览页面或正在与它进行交互.它可以处理活动状态,如在页面上空闲或活跃.您还可以使用 ifvisible.js 智能设置您的间隔,如 ...