簡體   English   中英

在SQL Server 2005中透視表以多次包含相同的列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM