• SqlServer的Case When语句等3种方法将行变成列


    select a.sname,max(a.语文) yuwen,max(a.数学) shuxue
    from (select sname, case kemu when '语文' then fenshu else 0 end 语文,
                        case kemu when '数学' then fenshu else 0 end 数学
            from tb_subjects
           ) a
    group by a.sname

    固定列数的行列转换

      如表结构为:     
         如 
    Name   subject score 
    --------------------------- 
    张三   语文   80 
    张三   数学   70 
    张三   英语   60 
    李四   语文   90 
    李四   数学   80 
    李四   英语   100 
    ....
        转换为 :
                   语文   数学   英语 
           张三    80     70     60 
           李四    90     80    100 
    要求:创建表,源表,表名: Stu , 只用一句sql 得到转换结果。
    解答:
    方法一 :通过生成临时表的方式操作
    select name ,sum(yw) as '语文',sum(sx)  as '数学',sum(wy) as '英语'
    from( 
    select name , 
    CASE subject WHEN '语文' THEN score END AS yw, 
    CASE subject WHEN '数学' THEN score END AS sx, 
    CASE subject WHEN '英语' THEN score END AS wy 
    from  Stu 
    ) tempStu
    group by name
    方法二:课程只有语文、数学、物理这三门课程则可以使用静态sql 来实现  Sql2000
    select name as 姓名, 
      max(case subject when '语文' then score else 0 end) 语文, 
      max(case subject when '数学' then score else 0 end) 数学, 
      max(case subject when '英语' then score else 0 end) 英语
    from Stu 
    group by name
    方法三:如果课程不止语文、数学、物理这三门课程 则可以使用动态sql 来实现
           创建一个用户变量,使用简单的T-SQL来实现。 Sql2000
    declare @sql varchar(8000)     --声明一个变量
    set @sql = 'select name as 姓名' 
    select @sql = @sql + ' , max(case subject when ''' + subject+ ''' then score  else 0 end) [' + subject+ ']' 
    from (select distinct subject from Stu) as a 
    set @sql = @sql + ' from Stu group by name' 
    print @sql   --打印生成的sql
    exec(@sql)   --执行该sql
      注: case when的作用就是一个条件选择语句,根据不同的要求显示不同的内容,格式是这样的case
           when [选择条件]
           then [结果1]
           else [结果2]
           end
       其中[选择条件]也可以放在case之后。
                     CASE WHEN语句在DB2,ORACLE,SQL SERVER系列,SYBASE等大型数据库都受到支持,是标准的SQL语句.

    现在写出解决方案:

    问题描述:

    有一张表,数据如下:

    复制代码
    /*
        Date        Tag
        2010-01-01   是
        2010-01-01   是
        2010-01-01   是
        2010-01-02   否
        2010-01-02   否
    */
    复制代码

    要求转换结果:

    复制代码
    /*
    转换结果:
    
        Date        是    否
        2010-01-01    3    0
        2010-01-02    0    2
    
    */
    复制代码


    用Case When语句解决:

    select TheDate,SUM(case Tag when '是' then 1 else 0 end) [是],
                   SUM(case Tag when '否' then 1 else 0 end) [否]
                   from #Test
                   group by TheDate

    以上SQL语句,可以通过构造变量了实现:

    复制代码
    create table #Test
    (
        TheDate    varchar(30),
        Tag    varchar(10)
    )
    
    go
    
    insert into #Test values ('2010-01-01','是');
    insert into #Test values ('2010-01-01','是');
    insert into #Test values ('2010-01-01','是');
    insert into #Test values ('2010-01-02','否');
    insert into #Test values ('2010-01-02','否');
    
    select * from #Test;
    
    --drop table #Test;
    
    
    declare @tempSelect varchar(4000);
    set @tempSelect = 'select TheDate';
    
    select @tempSelect += ',SUM(case Tag when '''+ Tag +''' then 1 else 0 end) ['+ Tag +']'
        from (select distinct Tag from #Test) as tab;--重点在这句话select distinct Tag from #Test
        
    select @tempSelect += ' ' + 'from #Test group by TheDate;'
    
    print @tempSelect
    exec(@tempSelect)
    复制代码

    执行结果:

    
    
     
     
  • 相关阅读:
    迭代器基础知识
    C语言I博客作业09
    第一周作业
    C语言1博客作业04
    C语言I博客作业08
    C语言博客作业05
    C语言I作业12—学期总结
    C语言I博客作业10
    C语言I博客作业06
    C语言I博客作业11
  • 原文地址:https://www.cnblogs.com/fhuafeng/p/16686429.html
Copyright © 2020-2023  润新知