码迷,mamicode.com
首页 > 其他好文 > 详细

说下查询动作 Pivot

时间:2016-03-01 16:01:45      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

上一篇说了一下查询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

标签:

原文地址:http://www.cnblogs.com/Gin-23333/p/5231316.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!