你的位置:首页 > 数据库

[数据库]说下查询动作 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 aEmp                        Mon       Tue       Wed       Thu-------------------------------------------------- ---------------- ---------------- ---------------- ----------------Ken                        09:00:00.0000000 08:53:00.0000000 09:03:00.0000000 08:51:00.0000000Mart                        09:00:00.0000000 08:55:00.0000000 09:02:00.0000000 08:50:00.0000000Reach                       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.0000000Mart                        Mon                        09:00:00.0000000Reach                       Mon                        09:00:00.0000000Ken                        Thu                        08:51:00.0000000Mart                        Thu                        08:50:00.0000000Reach                       Thu                        08:57:00.0000000Ken                        TUE                        08:53:00.0000000Mart                        TUE                        08:55:00.0000000Reach                       TUE                        08:51:00.0000000Ken                        Wed                        09:03:00.0000000Mart                        Wed                        09:02:00.0000000Reach                       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 技术内幕 查询>