zoukankan      html  css  js  c++  java
  • sql强大的行转列功能(内置函数pivot及注意事项)

    语法:

    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

    方法一:

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

    首先看看使用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 姓名
    

    方法二:使用pivot函数

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

    上面查询前提是:

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

    如果兼容级别不改为 90 ,查询结果如下:

  • 相关阅读:
    设置IIS7/IIS7.5的FTP支持断点续传
    win10图片打开方式里没有默认照片查看器的解决方法
    使用C#的HttpWebRequest模拟登陆网站
    在Raid模式下装Win10找不到固态硬盘怎么办
    C# String 前面不足位数补零的方法
    [SQL Server]无法创建 SSIS 运行时对象,请验证 DTS.dll 是否可用及是否已注册
    HTTPS协议说明
    技术晨读_20160217
    技术晨读_20160215
    fastcgi安装
  • 原文地址:https://www.cnblogs.com/zoro-zero/p/11334785.html
Copyright © 2011-2022 走看看