score表结构如
name subject score
-----------------------------------
大都 语文 59
大都 数学 78
大都 外语 89
大都 物理 98
小都 语文 90
小都 外语 80
小都 物理 70
德国 语文 90
德国 数学 50
德国 外语 80
德国 物理 89
哈哈 语文 99
哈哈 数学 80
哈哈 物理 89
现需转换成表结构如:
姓名 数学 外语 物理 语文
-----------------------------------------
大都 78 89 98 59
德国 50 80 89 90
哈哈 80 0 89 99
小都 0 80 70 90
解决之道:
--当出现的subject的个数不定的时候
declare @sql varchar(8000)
set @sql='SELECT name as 姓名'
select @sql=@sql+',['+subject+']=MAX(CASE subject WHEN '''+subject+''' THEN score ELSE 0 END)' from score group by subject
exec(@sql+' FROM score GROUP BY name')
--当出现的subject的个数确定的时候
select name as 姓名,
数学=MAX(CASE WHEN subject='数学' THEN score ELSE 0 END),
外语=MAX(CASE WHEN subject='外语' THEN score ELSE 0 END),
物理=MAX(CASE WHEN subject='物理' THEN score ELSE 0 END),
语文=MAX(CASE WHEN subject='语文' THEN score ELSE 0 END)
from score
group by name
set @sql = 'select [id], '
select @sql = @sql + quotename (subj) + '=max(case when style=' + quotename (subj, '''' ) + ' then rtrim(amount) else ''-'' end),' from t1 group by subj
-- 除去末尾的那个逗号 .
exec ( @sql )
insert T select '1' , ' 语文 ' , 90
union all select '1' , ' 数学 ' , 80
union all select '2' , ' 语文 ' , 90
union all select '2' , ' 数学 ' , 85
union all select '2' , ' 外语 ' , 70
declare @sql varchar( 8000 )
declare @sql2 varchar( 1000 )
set @sql = ''
set @sql2 = ' 總分 ='
select @sql = @sql + quotename ( 科目 ) + '=isnull( max(case when 科目 =' + quotename ( 科目 , '''' ) + ' then 分数 end), 100),' ,
@sql2 = @sql2 + 'tmp.' + 科目 + '+'
from T
group by 科目
select
@sql2 = left ( @sql2 , len ( @sql2 ) - 1 ),
@sql = left ( @sql , len ( @sql ) - 1 ),
@sql = 'select tmp.*,' + @sql2 + ' from (select 名字 ,' + @sql ,
@sql = @sql + ' from T group by 名字 ) tmp'
exec ( @sql )