2

私はテーブルを持っています:

    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

ありがとうございました!

4

1 に答える 1

3

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 を参照してください

于 2012-11-02T16:38:42.157 に答える