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

 

    

 

posted on 2016-03-01 15:51  神崎橙  阅读(372)  评论(0编辑  收藏  举报

导航