您的位置:澳门新葡8455最新网站 > 数据库管理 > [SQL Server]SQL行转列

[SQL Server]SQL行转列

发布时间:2020-01-01 14:01编辑:数据库管理浏览(150)

    SELECT * FROM (
    select ActionTargetType+actiontype as TypeResult, COUNT(RowGuid) as Number from BanJianLogInfo group by ActionTargetType,actiontype
    union
    select ActionTargetType+OperateResult+'总数' as TypeResult,count(*) from BanJianLogInfo
    group by ActionTargetType,OperateResult
    union
    select ActionTargetType+'总数' as TypeResult,count(*) from BanJianLogInfo group by ActionTargetType
    )temp
    PIVOT
    ( sum(Number) /*行转列后 列的值*/ FOR
    temp.TypeResult/*需要行转列的列*/ IN ([办件信息成功总数],[办件信息更新],[办件信息失败总数],[办件信息新增]/*列的值*/)
    ) AS T
    转换前

     PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。

    图片 1


    转换后

     

    图片 2

     测试数据

    语法:

    INSERT INTO [TestRows2Columns] ([UserName],[Subject],[Source])
    SELECT N'张三',N'语文',60 UNION ALL
    SELECT N'李四',N'数学',70 UNION ALL
    SELECT N'王五',N'英语',80 UNION ALL
    SELECT N'王五',N'数学',75 UNION ALL
    SELECT N'王五',N'语文',57 UNION ALL
    SELECT N'李四',N'语文',80 UNION ALL
    SELECT N'张三',N'英语',100
    GO

    SELECT * FROM TableName temp /*需要行转列数据源*/
    PIVOT
    ( sum(ColumnName1) /*行转列后 列的值*/ FOR
    temp.ColumnName2/*需要行转列的列*/ IN ([办件信息成功总数],[办件信息更新],[办件信息失败总数],[办件信息新增]/*列的值*/)
    ) AS T


    select UserName,
    sum(CASE Subject WHEN '数学' THEN Source ELSE 0 END)as 数学
    ,sum(CASE Subject WHEN '英语' THEN Source ELSE 0 END) as 英语
    ,sum(CASE Subject WHEN '语文' THEN Source ELSE 0 END) as 语文
    from [TestRows2Columns]
    GROUP BY UserName

    图片 3


     

    PIVOT行转列

    SELECT *
    FROM( SELECT [UserName] ,
    [Subject] ,
    [Source]
    FROM[TestRows2Columns]
    ) p PIVOT
    ( SUM([Source]) FOR [Subject] IN ( [数学],[英语],[语文] ) ) AS pvt
    ORDER BY pvt.[UserName];
    GO

    图片 4


     

     PIVOT求参加每项的次数

    SELECT '总数' AS [总次数],
    [数学],[英语],[语文] 
    from (SELECT Subject as [科目],[id]
    from TestRows2Columns)as tbl PIVOT
    ( COUNT([id])for tbl.[科目] IN([数学],[英语],[语文]))as tbl

    图片 5

    SELECT '总数' AS [总次数], [数学],[英语],[语文] --(选择行转列后的结果集的列)这里可以用“*”表示选择所有列,也可以只选择某些列(也就是某些科目)
    from (SELECT Subject as [科目],[id] from TestRows2Columns)as tbl PIVOT 查询所有科目和对应id号
    ( COUNT([id])for tbl.[科目] IN([数学],[英语],[语文]))as tbl将列科目里面的值 分别转换成列并计算每个列的数量

    行转列后,原来的某个列的值变做了列名,在这里就是原来Subject列的值“数学”,"语文"...做了列名,而我们需要做的另一个工作就是计算这些列的值(这里的“计算”其实就是PIVOT里面的聚合函数(sum,COUNT等))

    本文由澳门新葡8455最新网站发布于数据库管理,转载请注明出处:[SQL Server]SQL行转列

    关键词:

上一篇:没有了

下一篇:没有了