SQL行转列

如下:
id   sid   course   result

  1  2005001  语文    80.0

  2  2005001  数学    90.0

  3  2005001  英语    80.0

  4  2005002  语文    56.0

  5  2005002  数学    69.0

  6  2005002  英语    89.0

  declare @sql varchar(8000)
  set @sql='select sid'
  select @sql=@sql+','+course.name+'=isnull(sum(case course when '''+course.name+''' then result end),0)'
  from course order by id
  set @sql=@sql+' from result group by sid order by sid'
  print @sql
  exec(@sql)
  得出结果

  sid       语文    数学   英语

  2005001  80.0  90.0  80.0

  2005002  56.0  69.0  89.0
 

如果我要将
    id   sid   course   resulta   resultb

  1  2005001  语文    80.0      100
 
  2  2005001  数学    90.0       90

  3  2005001  英语    80.0       70 

  4  2005002  语文    56.0       80

  5  2005002  数学    69.0       85

  6  2005002  英语    89.0       80

变成如下格式该如何?

  sid       语文resulta 语文resultb   数学resulta...  英语resulta

  2005001  80.0        100             90.0          80.0

  2005002  56.0         80             69.0           89.0

解决方式:

if not object_id(N'Tempdb..course') is null
 drop table course
Go
Create table course([id] int,[sid] int,[course] nvarchar(2),[resulta] decimal(18,1),[resultb] int)
Insert course
select 1,2005001,N'语文',80.0,100 union all
select 2,2005001,N'数学',90.0,90 union all
select 3,2005001,N'英语',80.0,70 union all
select 4,2005002,N'语文',56.0,80 union all
select 5,2005002,N'数学',69.0,85 union all
select 6,2005002,N'英语',89.0,80
Go
declare @sql nvarchar(4000)
select @sql=N'select sid'
select
 @sql=@sql+N',['+[course]+N'resulta]=sum(case course when N'''+[course]+''' then [resulta]  else 0 end),['+[course]+N'resultb]=sum(case course when N'''+[course]+''' then [resultb]  else 0 end)'
  from course a
  WHERE ID=(SELECT TOP 1 ID FROM [course] WHERE course=a.course)
  ORDER BY ID

  print @sql
  exec(@sql+' from [course] group by [sid]')
/*
sid    语文resulta 语文resultb 数学resulta 数学resultb 英语resulta 英语resultb
2005001 80.0 100 90.0 90 80.0 70
2005002 56.0 80 69.0 85 89.0 80
*/

posted @ 2010-08-07 10:31  余音  阅读(162)  评论(0)    收藏  举报