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

  • 相关阅读:
    JAVA中的CAS
    深入介绍Java中的锁[原理、锁优化、CAS、AQS]
    Java并发之AQS详解
    Java线程池ThreadPoolExecutor使用和分析(一)
    LinkedBlockingQueue
    生产者消费者两种实现:wait/notifyAll和Lock/Condition
    Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
    jvm系列(1):JVM问答
    mysql不存在插入否则更新
    java.util.MissingResourceException: Can't find bundle for base name db, locale zh_CN
  • 原文地址:https://www.cnblogs.com/wucg/p/1908248.html
Copyright © 2011-2022 走看看