【SQL】——行列轉換


/*
源成績表結構
StuName              cid         score
-------------------- ----------- -----------
Ranen                1           80
Ranen                2           84
Ranen                3           98
kevin                1           74
kevin                2           98
kevin                3           100
jacky                1           50
jacky                3           96

源課程表結構
ID          cName
----------- ------------------------------
1           C#
2           javascript
3           Sql Server

轉換後表結構
StuName              C#          javascript  Sql Server
-------------------- ----------- ----------- -----------
jacky                50          NULL        96
kevin                74          98          100
Ranen                80          84          98

*/

Create Table CourseTable
(
 ID int identity primary key,
 cName nvarchar(30) not null
)
go
insert into CourseTable values('C#')
insert into CourseTable values('javascript')
insert into CourseTable values('Sql Server')

create table ScoreTable
(
 StuName varchar(20) not null,--學生
 cid int,--課程編號
 score int --成績
)
go
insert into ScoreTable values('Ranen',1,80)
insert into ScoreTable values('Ranen',2,84)
insert into ScoreTable values('Ranen',3,98)
insert into ScoreTable values('kevin',1,74)
insert into ScoreTable values('kevin',2,98)
insert into ScoreTable values('kevin',3,100)
insert into ScoreTable values('jacky',1,50)
insert into ScoreTable values('jacky',3,96)
go
--2000 靜態行列轉
select StuName,
max(case cname when 'C#' then Score else 0 end) C#,
max(case cname when 'javascript' then Score else 0 end) javascript,
max(case cname when 'Sql Server' then Score else 0 end) SqlServer
 from (
select s.StuName,c.cName,s.Score from ScoreTable s
inner join CourseTable c on s.cid=c.id) T group by StuName

--2000 動態SQL
--insert into CourseTable values('html') --添加一門課程測試動態SQL
declare @sql varchar(500)
set @sql = 'select StuName'
select @sql = @sql + ' , max(case cname when '''+cName+''' then Score else 0 end) ['+cName+']'
from (select distinct cName from CourseTable) as c
set @sql = @sql + ' from  (select s.StuName,c.cName,s.Score from ScoreTable s
       inner join CourseTable c on s.cid=c.id) T group by StuName'

exec(@sql)
go


--2005 靜態SQL
select * from (
 select s.StuName,c.cName,s.Score from ScoreTable s
 inner join CourseTable c on s.cid=c.id
) a pivot (max(Score) for cName in (C#,javascript,[Sql Server])) b

--2005 動態SQL
declare @sql varchar(500)
select @sql = isnull(@sql + ',' , '') + '['+cname+']' from CourseTable group by cName
exec ('select * from (
 select s.StuName,c.cName,s.Score from ScoreTable s
 inner join CourseTable c on s.cid=c.id
) a pivot (max(Score) for cName in (' + @sql + ')) b')
go
drop table CourseTable
drop table ScoreTable
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章