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
现在写出解决方案:
问题描述:
有一张表,数据如下:
/* 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)
执行结果: