2010-01-21 9 views
5

Ich brauche die folgende Tabelle mit dem Namen tblGameRoleName schwenken -eine Tabelle in SQL Server 2005 Verschwenkung derselben Spalte enthält mehrere Male

 

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 

der folgenden Tabelle, die die ‚Spieler‘ Spalte mehrfach hat -

 

Game  Coach  Player1  Player2 Player3 Player4 Player5 
VolleyBall Sujatha  Rajendran Juno Indira Ganesh Vasanth 
Tennis  Rajeshkumar Vivek  Rubala NULL NULL NULL 

Das Problem ist, dass die Anzahl der "Spieler" für verschiedene "Spiele" erhöht werden kann und die Ergebnistabelle sollte alle Spieler für alle Spiele zeigen. Zum Beispiel - Wenn ich das folgenden ‚Cricket‘ Team zu dieser Tabelle hinzufügen -

 

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 

Dann sollte die Ergebnistabelle 11 Spieler Spalten zeigen.

Kann dies mit Hilfe der PIVOT-Funktion erreicht werden? Wenn nicht, schlagen Sie bitte den richtigen Weg vor, um die Ergebnistabelle zu erreichen.

+0

Welche Kriterien verwenden Sie oder? der Spieler? –

+0

Es gibt keine Kriterien, um die Spieler zu bestellen. Die Reihenfolge ist überhaupt nicht wichtig. Der erste Spielerrekord für jedes Spiel kann als Spieler1 und der nächste Spielerrekord als Spieler2 usw. kommen. Wenn eine Bestellung erforderlich ist, um die Ergebnistabelle zu erreichen, können die Spieler alphabetisch sortiert werden. – MediumOne

Antwort

3

Dies ist möglicherweise einfacher in einer Front-End-Reporting/Display-Anwendung, aber für SQL müssen Sie eine dynamische Pivot ausführen. Da die Spalten jedoch durch eine sequenzielle Spielernummer gekennzeichnet sind und die spezifischen Spieler nach Spiel variieren, können Sie die typischen dynamischen sql-Beispiele nicht verwenden.

ist hier eine Möglichkeit, es zu tun:

Beispieldaten

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' 

dynamische SELECT und PIVOT Klauseln und die Anweisung EXEC'd erstellen

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 
+0

Danke! Es klappt! – MediumOne