日期:2014-05-18  浏览次数:20448 次

求一方法解决SQL 行列转换
假设有张学生成绩表(CJ)如下
Name       Subject       Result
张三       语文             80
张三       数学             90
张三       物理             85
李四       语文             85
李四       数学             92
李四       物理             82
想变成      
姓名       语文       数学       物理
张三       80             90           85
李四       85             92           82


------解决方案--------------------

create table Suser
(
Name Char(10)
,Subject Char(10)
,Result float
)

Insert Suser
Select 'zhang ', '语文 ', '70 '
union all
Select 'wang ', '语文 ', '60 '
union all
Select 'Zhang ', '物理 ', '100 '
Union all
Select 'wang ', '物理 ', '100 '
union all
Select 'Zhang ', '化学 ', '100 '
Union all
Select 'wang ', '化学 ', '100 '


Select Name
, '物理 '=Sum(Case Subject When '物理 ' then Result end)
, '化学 '=Sum(case Subject When '化学 ' then (Result) end)
, '语文 '=Sum(Case subject When '语文 'then result end) From Suser Group By name
------解决方案--------------------
select
name as 姓名,
sum(case when Subject = '语文 ' then Result else 0 end) as 语文,
sum(case when Subject = '数学 ' then Result else 0 end) as 数学,
sum(case when Subject = '物理 ' then Result else 0 end) as 物理
from cj
group by [name]
------解决方案--------------------
/*
Limpire:
*/

--原始数据:#Test
create table #Test (Name varchar(4),Subject varchar(4),Result int)
insert #Test
select '张三 ', '语文 ',80 union all
select '张三 ', '数学 ',90 union all
select '张三 ', '物理 ',85 union all
select '李四 ', '语文 ',85 union all
select '李四 ', '数学 ',92 union all
select '李四 ', '物理 ',82

declare @sql varchar(8000)
select @sql=coalesce(@sql+ ', ', ' ')+ '[ '+Subject+ ']=sum(case Subject when ' ' '+Subject+ ' ' ' then Result end) ' from #Test group by Subject
set @sql= 'select 姓名=Name, '+@sql+ ' from #Test group by Name '
print @sql
exec(@sql)
/*
姓名 数学 物理 语文
李四 92 82 85
张三 90 85 80
*/

--直接法:如果Subject是动态的不适合。
select 姓名=Name,[语文]=sum(case Subject when '语文 ' then Result end),[数学]=sum(case Subject when '数学 ' then Result end),[物理]=sum(case Subject when '物理 ' then Result end) from #Test group by Name
/*
姓名 语文 数学 物理
李四 85 92 82
张三 80 90 85
*/

--删除测试
drop table #Test

------解决方案--------------------
楼上正解
用动态SQL
------解决方案--------------------