求一方法解决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
------解决方案--------------------