zoukankan      html  css  js  c++  java
  • sql 2005 行转列 另一种方法

    CREATE TABLE [dbo].[RowToColumn](
    [姓名] [varchar](10) NULL,
    [课程] [varchar](10) NULL,
    [分数] [int] NULL
    ) ON [PRIMARY]
    
    insert into RowToColumn values 
     ('王五','语文','66')
    ,('王五','数学','67')
    ,('王五','物理','68')
    --...
    
    --法一.
    select 姓名,
    MAX(case 课程 when '语文' then 分数 else null end) as 语文,
    MAX(case 课程 when '数学' then 分数 else null end) as 数学,
    MAX(case 课程 when '物理' then 分数 else null end) as 物理
    from RowToColumn 
    group by 姓名
    GO
    --法二.
    select [姓名],[语文],[数学],[物理]
    from(
    select 姓名,课程, 分数 from rowtocolumn
    ) p
    PIVOT
    (
     avg( [分数]) For 课程 in (语文,数学,物理 )
    ) as t_unpvt
    GO
    
    
    

    使用 PIVOT 和 UNPIVOT

    PIVOT 提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单和更具可读性。有关 PIVOT 语法的完整说明,请参阅 FROM (Transact-SQL)。

    以下是带批注的 PIVOT 语法。

    SELECT <非透视的列>,

    [第一个透视的列] AS <列名称>,

    [第二个透视的列] AS <列名称>,

    ...

    [最后一个透视的列] AS <列名称>,

    FROM

    (<生成数据的 SELECT 查询>)

    AS <源查询的别名>

    PIVOT

    (

    <聚合函数>(<要聚合的列>)

    FOR

    [<包含要成为列标题的值的列>]

    IN ( [第一个透视的列], [第二个透视的列],

    ... [最后一个透视的列])

    ) AS <透视表的别名>

    <可选的 ORDER BY 子句>;


    可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值。

     pivot的用法:

     http://technet.microsoft.com/zh-cn/library/ms177410.aspx

  • 相关阅读:
    第三周作业
    面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?请根据自己的理解简明扼要的回答。
    移动APP开发使用什么样的原型设计工具比较合适?
    java 从上至下打印二叉树
    Qt applendPlainText()/append() 多添加一个换行解决方法
    tolua 转换 std::shared_ptr
    cmake add_custom_command 使用
    Boost使用笔记(Smart_ptr)
    webpack4 安装
    git安装管理
  • 原文地址:https://www.cnblogs.com/wucg/p/1908248.html
Copyright © 2011-2022 走看看