上の行を使用して列の行は、私は以下のような構造...SQLサーバーは、パーティション
人 を持っています。私の質問は、スキルをコラムとして表示するための結合を作成する方法です。
過去の仕事では、同僚が行オーバーパーティションを使用してこれを達成しましたが、私はどのように考えているか分かりません。私はピボットがオプションであることを知っているが、私の好みはパーティション上の行である。
アイデア?
上の行を使用して列の行は、私は以下のような構造...SQLサーバーは、パーティション
人 を持っています。私の質問は、スキルをコラムとして表示するための結合を作成する方法です。
過去の仕事では、同僚が行オーバーパーティションを使用してこれを達成しましたが、私はどのように考えているか分かりません。私はピボットがオプションであることを知っているが、私の好みはパーティション上の行である。
アイデア?
スキルの最大数が不明な場合は、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 |
+----------+------------+------------+
はい、実際のスキル数は不明です。 –
私はこれをできるだけ早くテストし、コメントを投稿すると明日の朝になるでしょう。返信ありがとうございました –
@MatthewStottお手伝いをお待ちしております! – SqlZim
あなたはおそらく両方のこと、たとえば必要になります。 – SqlZim