私はテーブルを持っています:
ID Note
1 1 aaa
2 1 bbb
3 1 ccc
4 2 ddd
5 2 eee
6 2 fff
私はそれを次のように返す必要があります:
ID Note1 Note2 Note3
1 1 aaa bbb ccc
2 2 ddd eee fff
ありがとうございました!
私はテーブルを持っています:
ID Note
1 1 aaa
2 1 bbb
3 1 ccc
4 2 ddd
5 2 eee
6 2 fff
私はそれを次のように返す必要があります:
ID Note1 Note2 Note3
1 1 aaa bbb ccc
2 2 ddd eee fff
ありがとうございました!
PIVOT
このタイプのクエリには関数を使用できます。既知の列数がある場合は、値をハードコーディングできます。
select *
from
(
select id, note,
'Note' +
cast(row_number() over(partition by id order by id) as varchar(10)) col
from yourtable
) x
pivot
(
max(note)
for col in ([Note1], [Note2], [Note3])
) p
デモで SQL Fiddle を参照してください
列に変換したい数が不明なnotes
場合は、動的SQLを使用できます。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ','
+ QUOTENAME('Note' +
cast(row_number() over(partition by id order by id) as varchar(10)))
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id,' + @cols + ' from
(
select id, note,
''Note'' +
cast(row_number() over(partition by id order by id) as varchar(10)) col
from yourtable
) x
pivot
(
max(note)
for col in (' + @cols + ')
) p '
execute(@query)
デモで SQL Fiddle を参照してください
どちらも同じ結果になります。
| ID | NOTE1 | NOTE2 | NOTE3 |
------------------------------
| 1 | aaa | bbb | ccc |
| 2 | ddd | eee | fff |
または、関数を使用したくない場合は、次のステートメントPIVOT
で集計関数を使用できます。CASE
select id,
max(case when rn = 1 then note else '' end) Note1,
max(case when rn = 2 then note else '' end) Note2,
max(case when rn = 3 then note else '' end) Note3
from
(
select id, note,
row_number() over(partition by id order by id) rn
from yourtable
) src
group by id
デモで SQL Fiddle を参照してください