2

私は次のようなデータを持っています:

address      | id  
12AnyStreet  | 1234  
12AnyStreet  | 1235  
12AnyStreet  | 1236  
12AnyStreet  | 1237 

私の目標は、次のように表示することです。

Address  id1   id2   id3   id4   
123Any   1234  1235  1246  1237

グーグルなどに基づいて、次のCTEを生成することができました。

with cust_cte (Address, id, RID) as (
    SELECT Address, id, 
           ROW_NUMBER() OVER (PARTITION BY (Address) ORDER BY Address) AS RID 
    FROM tab)  

次のステップは、RIDごとに、関連付けられたIDを列に配置するようにピボットすることです。しかし、私が見つけた例がうまくいくようには思えません。実際には当てはまらないかもしれない残りの例を投稿するのではなく、聴衆に任せます。必ずしもCTEを利用しない他の新しいアプローチも高く評価されています。これは大量のデータを処理するため、効率が重要です。

4

1 に答える 1

4

このデータは、SQLServerのPIVOT関数を使用して変換できます。データを取得するにPIVOTは、を使用して新しい列を作成する必要がありますrow_number()

既知の数の値がある場合は、クエリをハードコーディングできます。

select *
from
(
  select address, id,
    'id_'+cast(row_number() over(partition by address 
                                order by id) as varchar(20)) rn
  from yourtable
) src
pivot
(
  max(id)
  for rn in ([id_1], [id_2], [id_3], [id_4])
) piv

SQL FiddlewithDemoを参照してください

ただし、値が不明な場合は、動的SQLを使用する必要があります。

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

select @cols = STUFF((SELECT distinct ',' 
                      + QUOTENAME(rn) 
                    from
                    (
                      select 'id_'+cast(row_number() over(partition by address 
                                order by id) as varchar(20)) rn
                      from yourtable
                    ) src
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT address,' + @cols + ' from 
             (
                select address, id,
                  ''id_''+cast(row_number() over(partition by address 
                                              order by id) as varchar(20)) rn
                from yourtable
            ) x
            pivot 
            (
                max(id)
                for rn in (' + @cols + ')
            ) p '

execute(@query)

SQL FiddlewithDemoを参照してください

両方のクエリの結果は次のとおりです。

|     ADDRESS | ID_1 | ID_2 | ID_3 | ID_4 |
-------------------------------------------
| 12AnyStreet | 1234 | 1235 | 1236 | 1237 |
于 2013-02-13T16:13:30.727 に答える