5

tblGameRoleNameという名前の次のテーブルをピボットする必要があります-

ゲームの役割名
バレーボールコーチSujatha
バレーボール選手ラジェンドラン
バレーボール選手ジュノ
バレーボール選手インディラ
バレーボール選手ガネーシャ
バレーボール選手ヴァサント
テニスコーチRajeshkumar
テニスプレーヤーVivek
テニス選手ルバラ

'Player'列が複数回ある次の表に-

ゲームコーチPlayer1Player2Player3 Player4 Player5
バレーボールSujathaRajendranJuno Indira Ganesh Vasanth
テニスRajeshkumarVivekRubala NULL NULL NULL

問題は、「プレーヤー」の数が「ゲーム」ごとに増える可能性があり、結果テーブルにすべてのゲームのすべてのプレーヤーが表示されることです。例-次の「クリケット」チームをこのテーブルに追加した場合-

クリケットコーチゲイリー
クリケット選手ヴィル
クリケット選手ガウティ
クリケット選手サチン
クリケット選手マヒ
クリケット選手ユヴィ
クリケット選手Suresh
クリケット選手Virat
クリケット選手Bhajji
クリケット選手Zaheer
クリケット選手イシャント
クリケット選手アシッシュ

次に、結果テーブルに11のプレーヤー列が表示されます。

これはPIVOT機能の助けを借りて達成できますか?そうでない場合は、結果表を達成するための正しい方法を提案してください。

4

1 に答える 1

3

これは、フロントエンドのレポート/表示アプリケーションでは簡単な場合がありますが、SQLの場合は動的ピボットを実行する必要があります。ただし、列は連続したプレーヤー番号によってエイリアスされ、特定のプレーヤーはゲームによって異なるため、一般的な動的SQLの例を使用することはできません。

これを行う1つの方法は次のとおりです。

サンプルデータ

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'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

出力:

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
于 2010-01-21T19:23:37.720 に答える