1

私は次のようなシナリオを持っています

User | Session | Response
 u1  |   s1    |    r1
 u1  |   s1    |    r2
 u1  |   s2    |    r3
 u2  |   s2    |    r4
 u2  |   s2    |    r5

そして、出力は次のようである必要があります

アウトプットテーブル

User  | Session  | response1  | response2  | Session.....n
u1    |  s1      |   r1       |  r2       
u1    |  s2      |   r3       |  NULL   
u2    |  s2      |   r4       |  r5

そのセッション列は、応答数によってはn時間になる場合があります。

4

1 に答える 1

4

PIVOTこのデータ変換を実行する関数を実装できます。既知の数の値がある場合は、クエリをハードコーディングできます。

select *
from 
(
  select [user], session, response, 
    'response'+ cast(row_number() over(partition by [user], session order by response) as varchar(10)) rn
  from yourtable
) src
pivot
(
  max(response)
  for rn in ([response1], [response2])
) piv

SQL FiddlewithDemoを参照してください

ただし、応答の数が不明な場合は、動的SQLを使用することをお勧めします。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('response'+ cast(row_number() over(partition by [user], session order by response) as varchar(10))) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT [user], session, ' + @cols + ' from 
             (
              select [user], session, response, 
                ''response''+ cast(row_number() over(partition by [user], session order by response) as varchar(10)) rn
              from yourtable
            ) x
            pivot 
            (
                max(response)
                for rn in (' + @cols + ')
            ) p '

execute(@query)

SQL FiddlewithDemoを参照してください

どちらも同じ結果になります。

| USER | SESSION | RESPONSE1 | RESPONSE2 |
------------------------------------------
|   u1 |      s1 |        r1 |        r2 |
|   u1 |      s2 |        r3 |    (null) |
|   u2 |      s2 |        r4 |        r5 |
于 2012-11-14T18:08:41.607 に答える