• Sql2008的行列转换之行转列


    今天在工作的时候遇到了行列转换的问题,记得去年有一段时间经常写,但是许久不用已经记不太得了。好记性不如烂笔头,忙完之后赶紧记录一下。

    关键字:PIVOT(行转列),UNPIVOT(列转行)

    先说说 PIVOT(行转列)这是我今天遇到的问题


    PIVOT(行专列)

    主要语法:PIVOT(聚合函数(列) FOR 列 in (…) )AS P


    完整语法:

    table_source

    PIVOT(

    聚合函数(value_column)

    FOR pivot_column

    IN(<column_list>)

    )


    举例(这个最重要,没有例子只有概念的文章,不是好文章)

    我这里有一张表

    其中OperationDate这里一列是日期,要求是:对日期进行分组,统计Testuser每天的操作。最重要的是日期要做为列名显示,如下图

    直接贴sql语句

    DECLARE @columnNme NVARCHAR(4000)
    SELECT @columnNme = ISNULL(@columnNme + ',', '') + QUOTENAME(CONVERT(varchar(100), [OperationDate], 23)) FROM [Test].[dbo].[OperationData]
    group by CONVERT(varchar(100), [OperationDate], 23)
    order by CONVERT(varchar(100), [OperationDate], 23)

    --select(@columnNme )

    ---上面一部分,是取出不重复的日期,一会儿要做为列名, QUOTENAME是在“xxxx-xx-xx”这种不规则的列名合法化,它会变成[xxxx-xx-xx] , 加了两个[  ]
    Declare @sql NVARCHAR(4000)
    set @sql = 'select * from
    (
    SELECT od.UserName
    ,CONVERT(varchar(100), od.[OperationDate], 23) as 日期
    ,COUNT(1) as 浏览数
    FROM [Test].[dbo].[OperationData] as od
    group by CONVERT(varchar(100), od.[OperationDate], 23),od.UserName
    ) as t
    pivot (
         max(浏览数) for 日期
         in ('+@columnNme +')
    ) as result'

    --select(@sql)
    EXEC( @sql)

    这种写法是列名数量不固定的时候,需要动态生成。

    下面是静态列名,也就是列名的数量是固定的

    select * from
    (
         SELECT od.UserName,CONVERT(varchar(100),od.[OperationDate], 23) as 日期,COUNT(1) as 浏览数
         FROM [Test].[dbo].[OperationData] as od
        group by CONVERT(varchar(100), od.[OperationDate], 23),od.UserName
        ) as t
        pivot (
        max(浏览数) for 日期
        in
        (
            [2016-05-21],
            [2016-05-22],
            [2016-05-23]
        )
    ) as result

  • 相关阅读:
    超级迷宫我的计划表
    不敢死队
    Let the Balloon Rise
    Hangover
    汉诺塔系列2
    Tri Tiling(递推)
    Tiling(递推,高精度)
    Color Me Less
    I Think I Need a Houseboat(圆计算)
    Kbased Numbers(递推)
  • 原文地址:https://www.cnblogs.com/tfiremeteor/p/5519910.html
Copyright © 2020-2023  润新知