当前位置: 代码迷 >> Sql Server >> 三列的数据,怎么让前两列成为横纵坐标(抱歉不太会用文字描述这个)
  详细解决方案

三列的数据,怎么让前两列成为横纵坐标(抱歉不太会用文字描述这个)

热度:62   发布时间:2016-04-24 08:59:30.0
三列的数据,如何让前两列成为横纵坐标(抱歉不太会用文字描述这个)
  DB(数据库版本): MSSQL2008

假设我有每门课每个同学的成绩,按下面第一个表的格式储存。怎么做才能得到后面那张表,即第一个列名仍是course,后面的列名变成每个同学的名字,对应是他们的分数。

例如:表结构:
course            name           score
1                     a                     7
1                     b                      8
1                     c                      9
2                     a                     6
2                     b                     9
2                     c                      8
2                     d                      7
3                     a                      7
3                     b                      7
3                     c                      7
3                     d                      7


期望得到的结果如下:
class              a               b              c               d 
1                    7                8              9              null
2                    6                9              8              7
3                    7                7              7              7

我是新手,不太清楚该怎么查找这个问题的解法,希望各位前辈能够指点!谢谢!
 
------解决思路----------------------


if object_id('tempdb..#tab') is not null
drop table #tab
create table #tab (course int,name varchar(30),score int) 
 insert into #tab
select 1,'a',7 union all
select 1,'b',8 union all
select 1,'c',9 union all
select 2,'a',6 union all
select 2,'b',9 union all
select 2,'c',8 union all
select 2,'d',7 union all
select 3,'a',7 union all
select 3,'b',7 union all
select 3,'c',7 union all
select 3,'d',7

declare @sql varchar(max)
select @sql=isnull(@sql+',','')+quotename(name,'[') from #tab
group by name
set @sql='select * from #tab pivot (max(score) for name in('+@sql+'))p'
exec (@sql)

行转列问题。
------解决思路----------------------
--	drop table #table
create table #table(course int,name nvarchar(20),score int)
go
insert into #table(course,name,score)
values(1,'a',7),(1,'b',8),(1,'c',9)
,(2,'a',6),(2,'b',9),(2,'c',8),(2,'d',7)
,(3,'a',7),(3,'b',7),(3,'c',7),(3,'d',7)
go

--结果
select * from #table pivot(max(score) for name in([a],[b],[c],[d])) as t