上一篇说了一下查询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. 用于PHP的Gearman Worker管理工具GearmanManager

    项目地址:https://github.com/brianlmoon/GearmanManager PHP环境要求 PHP 5.5.9 POSIX extension Process Control ...

  2. Oracle数据库,模糊查询、去重查询

    分组去重查询,并执行某一个函数 :select  分组字段,聚合函数 from 表名 where 条件 group by分组字段 select 分组字段,聚合函数 from 表名 where 条件 g ...

  3. MAC下反編譯安卓APK

    所需工具: 1.apktool   http://ibotpeaches.github.io/Apktool/  (配置說明)       https://bitbucket.org/iBotPeac ...

  4. AppleDoc的安裝使用

    前言,還是那句話,新手按照濤叔下面畫黃色的步驟順序執行就好了,不要問為什麼. 一.安裝(注意,濤叔事先已經下載了appledoc) 1.找到下載的appledoc目錄 $ cd /Users/libo ...

  5. mysql autocommit=OFF导致wordpress 建立数据库连接时出错

    今天安装wordpress完成后跳转到login页面时,出现建立数据库连接时出错.网上清一色的拷贝http://mt.sohu.com/20160917/n468547634.shtml的答案. 只能 ...

  6. 类似 Dribbble 下载按钮的 SVG 弹性动画进度条

    Codrops 发布了一个如何创建一个基于弹性效果的 SVG 加载进度条教程,基于 SVG 和 TweenMax 实现.按钮开始的时候是一个带有箭头的图标,一旦它被点击,动画成一个有趣的小金属丝和一个 ...

  7. .NET正则表达式匹配Silverlight

    这是一个.NET正则表达式匹配工具的Silverlight 在页面中加入以下代码就可以了: <"> <param name="source" value ...

  8. 用Phaser来制作一个html5游戏——flappy bird (一)

    Phaser是一个简单易用且功能强大的html5游戏框架,利用它可以很轻松的开发出一个html5游戏.在这篇文章中我就教大家如何用Phaser来制作一个前段时间很火爆的游戏:Flappy Bird,希 ...

  9. JavaScript学习笔记-函数

    函数的两种创建方式:函数定义表达式.函数声明语句 编译时,函数声明语句创建的函数会‘被提前’至外部函数的作用域顶部,在该作用域内可以被随意调用: 而函数表达式创建的函数,要调用它必须赋值给一个变量,编 ...

  10. 如何在silverlight中以同步方式 获取sharepoint2013站点的当前登录账号

    最近有个项目用到了silverlight要同步方式获取当前登录账号.异步的方式无法跟其他应用结合.主要先后顺序问题.但是silverlight非常不好获取到当前登录账号.即使获取到了也是异步方式获取. ...