zoukankan      html  css  js  c++  java
  • SQL Server行转列

    PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现

    PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P

    完整语法:

    table_source

    PIVOT(

    聚合函数(value_column)

    FOR pivot_column

    IN(<column_list>)

    )

    UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现

    完整语法:

    table_source

    UNPIVOT(

    value_column

    FOR pivot_column

    IN(<column_list>)

    )

    注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别
     在数据库属性->选项->兼容级别改为   90

    -----------------------------------------------------------------------------------------华丽的分隔符-------------------------------------------------------------------------------------------------

    最简单的案例:一句话转换

    建表:

    if object_id('tb')is not null drop table tb
    Go
    create table tb(姓名 varchar(10),课程 varchar(10),分数 int)
    insert into tb values('张三','语文',74)
    insert into tb values('张三','数学',83)
    insert into tb values('张三','物理',93)
    insert into tb values('李四','语文',74)
    insert into tb values('李四','数学',84)
    insert into tb values('李四','物理',94)
    go

    select * from tb

    --------------------------------结果------------------------------------------------------------------------------------

    姓名         课程         分数
    ---------- ---------- -----------
    张三         语文         74
    张三         数学         83
    张三         物理         93
    李四         语文         74
    李四         数学         84
    李四         物理         94


    (6 行受影响)



    现在的问题是:我想根据姓名统计这个人的三门成绩,即:姓名   语文   数学  物理

    首先看看使用case when end结构的时候:

    select 姓名,
     max(case 课程 when '语文' then 分数 else 0 end)语文,
     max(case 课程 when '数学'then 分数 else 0 end)数学,
     max(case 课程 when '物理'then 分数 else 0 end)物理
    from tb
    group by 姓名

    --------------------------------结果------------------------------------------------------------------------------------

    姓名         语文          数学          物理
    ---------- ----------- ----------- -----------
    李四         74          84          94
    张三         74          83          93


    (2 行受影响)

    这个结果就是我们想要的,然后再看看使用pivot:

    select * from tb pivot(max(分数) for 课程 in (语文,数学,物理))a

    --------------------------------结果------------------------------------------------------------------------------------

    姓名         语文          数学          物理
    ---------- ----------- ----------- -----------
    李四         74          84          94
    张三         74          83          93

  • 相关阅读:
    Leetcode 回溯法 典型例题
    LeetCode 回溯法 别人的小结 八皇后 递归
    回溯算法 LEETCODE别人的小结 一八皇后问题
    python学习 面向对象高级编程
    python 学习 面向对象编程
    python 学习 模块
    python 学习 map /reduce
    pyhton 学习 函数式编程
    python学习 函数
    使用dict和set
  • 原文地址:https://www.cnblogs.com/believeinmyself/p/5942611.html
Copyright © 2011-2022 走看看