2017-03-12 13 views
1

上の行を使用して列の行は、私は以下のような構造...SQLサーバーは、パーティション

人 を持っています。私の質問は、スキルをコラムとして表示するための結合を作成する方法です。

過去の仕事では、同僚が行オーバーパーティションを使用してこれを達成しましたが、私はどのように考えているか分かりません。私はピボットがオプションであることを知っているが、私の好みはパーティション上の行である。

アイデア?

+0

あなたはおそらく両方のこと、たとえば必要になります。 – SqlZim

答えて

1

スキルの最大数が不明な場合は、dynamic sqlを使用する必要があります。 pivot()で使用するためにPersonIdで区切られた各リストに番号を付けるには、row_number()を使用する必要があります。

テストのセットアップ:

create table t (skillid int, personid int, skill varchar(32)); 
insert into t values (1,1,'sql-server'),(3,1,'sql'),(9,2,'sql-server'); 

declare @cols nvarchar(max); 
declare @sql nvarchar(max); 

    select @cols = stuff((
    select distinct 
     ',' + quotename('Skill_' 
      +convert(nvarchar(10),row_number() over (
       partition by PersonId 
       order by  Skill 
     )) 
     ) 
     from t 
     for xml path (''), type).value('.','nvarchar(max)') 
    ,1,1,''); 

select @sql = ' 
select PersonId, ' + @cols + ' 
    from (
    select 
     PersonId 
     , Skill 
     , rn=''Skill_''+convert(nvarchar(10),row_number() over (
      partition by PersonId 
      order by  Skill 
     )) 
     from t 
    ) as a 
pivot (max([Skill]) for [rn] in (' + @cols + ')) p'; 
select @sql as CodeGenerated; 
exec sp_executesql @sql; 

rextesterデモ:生成http://rextester.com/OFHO71002

コード:

select PersonId, [Skill_1],[Skill_2] 
    from (
    select 
     PersonId 
     , Skill 
     , rn='Skill_'+convert(nvarchar(10),row_number() over (
      partition by PersonId 
      order by  Skill 
     )) 
     from t 
    ) as a 
    pivot (max([Skill]) for [rn] in ([Skill_1],[Skill_2])) p 

リターン:

+----------+------------+------------+ 
| PersonId | Skill_1 | Skill_2 | 
+----------+------------+------------+ 
|  1 | sql  | sql-server | 
|  2 | sql-server | NULL  | 
+----------+------------+------------+ 
+0

はい、実際のスキル数は不明です。 –

+0

私はこれをできるだけ早くテストし、コメントを投稿すると明日の朝になるでしょう。返信ありがとうございました –

+0

@MatthewStottお手伝いをお待ちしております! – SqlZim

関連する問題