2010-01-21 17 views
5

que necesitan para hacer pivotar la tblGameRoleName siguiente tabla llamada -pivotar una tabla en SQL Server 2005 para contener misma columna varias veces

 

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 

a la siguiente tabla que tiene el 'jugador' de columnas múltiples veces -

 

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

El problema es que la cantidad de "jugadores" puede aumentar para diferentes "juegos" y la tabla de resultados debe mostrar todos los jugadores para todos los juegos. Por ejemplo: si agrego el siguiente equipo de 'cricket' a esta tabla:

 

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 

Luego, la tabla de resultados debe mostrar 11 columnas de jugador.

¿Se puede lograr esto con la ayuda de la función PIVOT? De lo contrario, sugiera la forma correcta de lograr la tabla de resultados.

+0

¿Qué criterio utilizas o der los jugadores? –

+0

No hay criterios para ordenar a los jugadores. El orden no es importante en absoluto. El primer registro de jugador para cualquier juego puede venir como Jugador 1 y el siguiente registro de jugador puede venir como Jugador 2, y así sucesivamente. Si un pedido es obligatorio para lograr la tabla de resultados, entonces los jugadores pueden ordenarse alfabéticamente. – MediumOne

Respuesta

3

Esto puede ser más fácil en una aplicación de informes/visualización frontal, pero para sql debe realizar un pivote dinámico. Pero dado que las columnas tienen un alias por un número de jugador secuencial y los jugadores específicos varían según el juego, no se pueden usar ejemplos dinámicos típicos de sql.

Aquí es una manera de hacerlo:

datos de la muestra

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' 

crear cláusulas SELECT y cruzada dinámica y la declaración EXEC'd

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 

SALIDA:

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

Gracias! ¡Funciona! – MediumOne

Cuestiones relacionadas