您的位置:首页 > 其它

使用 case when进行行列转换

2014-06-19 13:38 741 查看
来源:scdn,博客园

固定列数的行列转换

  如表结构为:     

     如 
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 @sq
4000
l = @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)

执行结果:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  case when 行列转换