0

ユーザーのデータが複数行ある SQL テーブルがあります。そのデータをクエリして、ユーザーごとに 1 行を返したいと考えています。したがって、複数の行を取得して、それらを複数の列を持つ1つの行に結合したいと考えています。これは可能ですか?

ここに私が現在持っているものがあります

UserID   Value
8111     396285
8111     812045789854
8111     Secretary

これが私が求めているものです

UserID     Column1     Column2        Column3
8111       396285      812045789854   Secretary
4

2 に答える 2

2

PIVOT関数を使用して結果を取得できます。関数を使用して、row_number()列に変換される値を生成しました。

値の数が事前にわかっている場合は、クエリをハードコーディングできます。

select userid, Col1, Col2, Col3
from
(
  select userid, value,
    'Col'+cast(row_number() over(partition by userid 
                                  order by (select 1)) as varchar(10)) rn
  from yt
) d
pivot
(
  max(value)
  for rn in (Col1, Col2, Col3)
) piv;

SQL Fiddle with Demoを参照してください。

値の数が不明な場合は、動的 SQL を使用できます。

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Col'+cast(row_number() over(partition by userid 
                                                                                    order by (select 1)) as varchar(10))) 
                    from yt
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT userid,' + @cols + ' 
             from 
             (
                select userid, value,
                  ''Col''+cast(row_number() over(partition by userid 
                                                order by (select 1)) as varchar(10)) rn
                from yt
            ) x
            pivot 
            (
                max(value)
                for rn in (' + @cols + ')
            ) p '

execute(@query);

SQL Fiddle with Demoを参照してください。両方とも結果が得られます。

| USERID |   COL1 |         COL2 |      COL3 |
----------------------------------------------
|   8111 | 396285 | 812045789854 | Secretary |
于 2013-04-19T19:37:04.357 に答える