求一方法解决SQL 行列转换
假设有张学生成绩表(CJ)如下
Name Subject Result
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 数学 92
李四 物理 82
想变成
姓名 语文 数学 物理
张三 80 90 85
李四 85 92 82
[解决办法]
create table Suser
(
NameChar(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)
/*
姓名数学物理语文
李四928285
张三908580
*/
--直接法:如果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
/*
姓名语文数学物理
李四859282
张三809085
*/
--删除测试
drop table #Test
[解决办法]
楼上正解
用动态SQL
------解决方案--------------------
--和我整理的东西这么象?
普通行列转换
假设有张学生成绩表(t)如下
Name Subject Result
张三 语文 73
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成
姓名 语文 数学 物理
张三 73 83 93
李四 74 84 94
create table #t
(
Name varchar(10) ,
Subject varchar(10) ,
Result int
)
insert into #t(Name , Subject , Result) values( '张三 ', '语文 ', '73 ')
insert into #t(Name , Subject , Result) values( '张三 ', '数学 ', '83 ')
insert into #t(Name , Subject , Result) values( '张三 ', '物理 ', '93 ')
insert into #t(Name , Subject , Result) values( '李四 ', '语文 ', '74 ')
insert into #t(Name , Subject , Result) values( '李四 ', '数学 ', '83 ')
insert into #t(Name , Subject , Result) values( '李四 ', '物理 ', '93 ')
declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名 '
select @sql = @sql + ' , sum(case Subject when ' ' ' + Subject + ' ' ' then Result end) [ ' + Subject + '] '
from (select distinct Subject from #t) as a
set @sql = @sql + ' from #t group by name '
exec(@sql)
drop table #t
--结果
姓名 数学 物理 语文
---------- ----------- ----------- -----------
李四 83 93 74
张三 83 93 73
----------------------------------------------------
如果上述两表互相换一下:即
姓名 语文 数学 物理
张三 73 83 93
李四 74 84 94
想变成
Name Subject Result
张三 语文 73
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
create table #t
(
姓名 varchar(10) ,
语文 int ,
数学 int ,
物理 int
)
insert into #t(姓名 , 语文 , 数学 , 物理) values( '张三 ',73,83,93)
insert into #t(姓名 , 语文 , 数学 , 物理) values( '李四 ',74,84,94)
select 姓名 as Name, '语文 ' as Subject,语文 as Result from #t union
select 姓名 as Name, '数学 ' as Subject,数学 as Result from #t union
select 姓名 as Name, '物理 ' as Subject,物理 as Result from #t
order by 姓名 desc
drop table #t
--结果
Name Subject Result
---------- ------- -----------
张三 数学 83
张三 物理 93
张三 语文 73
李四 数学 84
李四 物理 94
李四 语文 74
(所影响的行数为 6 行)
[解决办法]
IF EXISTS (SELECT NAME FROM TEMPDB.DBO.SYSOBJECTS WHERE ID=OBJECT_ID( 'TEMPDB..#TEST '))
DROP TABLE #TEST
create table #Test (Name varchar(40),Subject varchar(40),Result int)
insert #Test
select N '张三 ',N '语文 ',80 union all
select N '张三 ',N '数学 ',90 union all
select N '张三 ',N '物理 ',85 union all
select N '李四 ',N '语文 ',85 union all
select N '李四 ',N '数学 ',92 union all
select N '李四 ',N '物理 ',82
declare @str varchar(2000)
set @str= ' '
select @str=@str+ ',max(case when subject= '+ ' ' ' '+subject+ ' ' ' '+ ' then result else null end ) as '+ ' ' ' '+subject+ ' ' ' ' from
#test group by subject
set @str= 'select name '+@str+ ' from #test group by name '
exec(@str)
[解决办法]
哎...楼主冤枉好人啦
[解决办法]
自己去搜索一下啦,这种贴好多的