zoukankan      html  css  js  c++  java
  • SqlServer PIVOT行转列

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


     

     测试数据

    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 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


    PIVOT行转列

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


     PIVOT求参加每项的次数

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

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

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

  • 相关阅读:
    Loadrunner日志设置与查看
    webclient乱码问题
    (转)ASP.NET QueryString乱码解决问题
    Request.url请求路径的一些属性
    (转)Asp.net的HttpCookie写入汉字读取时为乱...
    (转)[jQuery]使用jQuery.Validate进行客户端验证(初级篇)——不使用微软验证控件的理由
    jquery validate 配合ligerui使用
    (转)ligerUI 使用教程之Tip介绍与使用
    (转)XML CDATA是什么?
    (转)C#中Trim()、TrimStart()、TrimEnd()的用法 .
  • 原文地址:https://www.cnblogs.com/yyfh/p/6971893.html
Copyright © 2011-2022 走看看