说下查询动作 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 技术内幕 查询>

时间: 2024-12-15 16:07:49

说下查询动作 Pivot的相关文章

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

几种在Linux下查询外网IP的办法. Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl curlmyip.com curl ip.appspot.com curl ipinfo.io/ip curl ipecho.net/plain curl www.trackip.net/i curl JSON格式输出: curl ipinfo.io/json curl ifconfig.me/all.json curl www.trackip.n

复杂sql分组查询 ( pivot)

一个数据表里面字段有年.月.日.金额.支付方式等字段,然后现在想写个sql语句,把每一天的每种支付方式金额(支付方式有多重)排在同一行, 最后在增加一列小计当前的所有支付方式的金额.如下图: 原sql查询出来的结果是这样的: ------------------------------------------------------------------------------------------- 然后想实现的sql结果最后呈现是这样的: 这可为难了我了,简单的增删改查左右链接sql语句

Linux shell 命令行下查询外网IP

查询IP在网页上打开网址就可以显示,但是在命令行下可以安装w3m/Links/Lynx这些命令行浏览器,但是为了这个又感觉不方便,所以很多查IP网站提供了UNIX/LINUX的. 命令行查询(详细): UNIX/Linux: #curl cip.cc Windows:    >telnet cip.cc             >ftp cip.cc              命令行查询(纯ip): UNIX/Linux:    #curl ip.cip.cc 参考: http://www.c

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

在运维工作中,有时需要查询某些域名的注册信息(域名的NS,注册用户,注册邮箱等),可以使用whois这个命令.whois命令令用来查找并显示指定帐号(或域名)的用户相关信息,因为它是到Network Solutions的WHOIS数据库去查找,所以该帐号名称必须在上面注册方能寻获,且名称没有大小写的差别. 即whois命令会列出给出的域名的域名所有者的信息. 如果系统里没有安装whois,可以用以下命令安装 [[email protected] ~]# yum search whois[[ema

Linux下查询CPU 缓存的工具

在Linux下能够使用例如以下工具查询CPU缓存: 方式1: $ lscpu L1d cache: 32K <span style="white-space:pre"> </span>(一级数据缓存) L1i cache: 32K <span style="white-space:pre"> </span><span style="font-family: Arial, Helvetica, sans-

linux 系统下查询当前raid级别

Linux系统下不安装第三方软件查询当前raid级别 测试环境   HP BL685 G7     SUSE 11 SP4 udevadmin info --query=all --name=/dev/sda --attribute-walk|grep raid ATTRS{raid_level}=="RAID 1(1+0)"

大数据量情况下查询性能低,耗时长的一种问题以及解决思路

背景交代: 1   mongodb 有500万条数据 2  经过过滤 还有20多万条数据 要得到上述20w条数据,一次查询得到20多万条,很可能会产生性能问题,于是同事用for循环,每次查询1000条数据,下一次skip 1000条,take 1000条.导致性能及其低下,早上请求,下午才获得完整数据. 解决方法思路是将1000改成5000 原因: 第一次 取1000 第二次 先数完前1000行 再取1000 第三次 先数完前2000行 再取1000 ... 第二百次 数完199000 再取10

PHP下查询游戏《Minecraft》多人游戏 服务器的人数。

废话不多说,直接上图: 作为一个优雅的Minecraft服务器,肯定需要官网的嗯. 很多服务器的官网都有显示当前服务器在线人数,延迟,每一个子服在线人数,甚至出了个流量图. 我们不搞花里胡哨的查询人数,直接用最简单的代码去完成一个简约的人数查询. 很好,让我们来搞吧! 首先我们需要引用一个外部PHP文件. 名字可以起做STATUS.CLASS.php 然后里面加入如下代码: 1 <?php 2 3 /** 4 * Minecraft服务器状态查询 5 * @作者 Julian Spravil <

Linux基础教程 linux下查询history操作时间的方法

要在linux操作系统中查看history记录的操作时间,可以按如下步骤实现: 学习linux 1,修改/etc/profile文件,在末尾添加:exporthisttimeformat="%f %t `whoami` " 2,或在用户目录下,修改文件 .bash_profile,添加export histtimeformat="%f%t `whoami` " 退出终端,重新登录. 例,查看history操作时间: 复制代码代码如下: [[email protect