[英]Pivoting a table in SQL Server 2005 to contain same column multiple times
我需要透過以下名為tblGameRoleName的表 -
Game Role Name VolleyBall Coach Sujatha VolleyBall Player Rajendran VolleyBall Player Juno VolleyBall Player Indira VolleyBall Player Ganesh VolleyBall Player Vasanth Tennis Coach Rajeshkumar Tennis Player Vivek Tennis Player Rubala
到下面有多次'Player'列的表 -
Game Coach Player1 Player2 Player3 Player4 Player5 VolleyBall Sujatha Rajendran Juno Indira Ganesh Vasanth Tennis Rajeshkumar Vivek Rubala NULL NULL NULL
問題是“玩家”的數量可以針對不同的“游戲”增加,結果表應該顯示所有游戲的所有玩家。 例如 - 如果我將以下'板球'團隊添加到此表中 -
Cricket Coach Gary Cricket Player Viru Cricket Player Gauti Cricket Player Sachin Cricket Player Mahi Cricket Player Yuvi Cricket Player Suresh Cricket Player Virat Cricket Player Bhajji Cricket Player Zaheer Cricket Player Ishant Cricket Player Ashish
然后結果表應顯示11個播放器列。
這可以通過PIVOT功能實現嗎? 如果沒有,請建議正確的方法來實現結果表。
在前端報告/顯示應用程序中這可能更容易,但對於sql,您需要執行動態數據透視。 但由於列是按順序玩家編號別名而且特定玩家因游戲而異,因此您無法使用typcial動態sql示例。
這是一種方法:
樣本數據
set ansi_warnings off
set nocount on
create table #t (Game varchar(20), Role varchar(15), [Name] varchar(20))
insert #t
select 'VolleyBall', 'Coach', 'Sujatha'
union all select 'VolleyBall', 'Player', 'Rajendran'
union all select 'VolleyBall', 'Player', 'Juno'
union all select 'VolleyBall', 'Player', 'Indira'
union all select 'VolleyBall', 'Player', 'Ganesh'
union all select 'VolleyBall', 'Player', 'Vasanth'
union all select 'Tennis', 'Coach', 'Rajeshkumar'
union all select 'Tennis', 'Player', 'Vivek'
union all select 'Tennis', 'Player', 'Rubala'
union all select 'Cricket', 'Coach', 'Gary'
union all select 'Cricket', 'Player', 'Viru'
union all select 'Cricket', 'Player', 'Gauti'
union all select 'Cricket', 'Player', 'Sachin'
union all select 'Cricket', 'Player', 'Mahi'
union all select 'Cricket', 'Player', 'Yuvi'
union all select 'Cricket', 'Player', 'Suresh'
union all select 'Cricket', 'Player', 'Virat'
union all select 'Cricket', 'Player', 'Bhajji'
union all select 'Cricket', 'Player', 'Zaheer'
union all select 'Cricket', 'Player', 'Ishant'
union all select 'Cricket', 'Player', 'Ashish'
創建動態SELECT和PIVOT子句以及EXEC語句
declare @max int
select top 1 @max = count(*)
from #t
where role = 'player'
group by game
order by count(*) desc
declare @sel varchar(2000)
,@piv varchar(2000)
;with nos (n) as (select 1 union all select n+1 from nos where n < @max)
select @sel = coalesce(@sel + ', '
+ 'max([' + convert(varchar(2), n) + ']) as player' + convert(varchar(2), n)
, 'max([' + convert(varchar(2), n) + ']) as player' + convert(varchar(2), n)
)
,@piv = coalesce(@piv + ',[' + convert(varchar(2), n) + ']', '[' + convert(varchar(2), n) + ']')
from nos
-----------------------------------------------------------------------------
exec('
select p.game
,max(p.coach) as coach
,' + @sel + '
from (
select game
,case when role = ''coach'' then [name] end as coach
,case when role = ''player'' then [name] end as player
,row_number() over (partition by game, role order by name) as seq
from #t
) d
pivot (max(player) for seq in (' + @piv + ')) p
group by p.game
')
go
drop table #t
OUTPUT:
game coach player1 player2 player3 player4 player5 player6 player7 player8 player9 player10 player11
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
Cricket Gary Ashish Bhajji Gauti Ishant Mahi Sachin Suresh Virat Viru Yuvi Zaheer
Tennis Rajeshkumar Rubala Vivek NULL NULL NULL NULL NULL NULL NULL NULL NULL
VolleyBall Sujatha Ganesh Indira Juno Rajendran Vasanth NULL NULL NULL NULL NULL NULL
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.