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

        

  • 相关阅读:
    ASP.NET CORE3.0 API Swagger+IdentityServer4授权验证
    Ubuntu16.04安装RabbitMq并设置用户
    使用sql实现表90度旋转(矩阵转置)
    HDWiKi新架设网站打开慢原因排查1.4秒→0.03秒
    手机端网页设置了csswidth:100%,但不能显示完整的问题
    SQL Server 2008 收缩日志
    MSSQL查看一个数据库中所有表的行数
    那就简单说说这个服务器吧,题外话。
    win7单独安装php
    css兼容写法
  • 原文地址:https://www.cnblogs.com/Gin-23333/p/5231316.html
Copyright © 2020-2023  润新知