1

私はこれに似たSQLテーブルを持っています:

+-----------------------------------------------+
|   ID   | FirstName | LastName  | SomeOtherData|
+-----------------------------------------------+
|  200   | Robert    | Barone    | Foo          |
|  228   | Doug      | Heffernan | Bar          |
|  2091  | Robert    | Barone    | Foo          |
|  3921  | Doug      | Heffernan | Bar          |
|  291   | Greg      | Warner    | Barfoo       |
+-----------------------------------------------+

今、私が作成するのに問題があるのは、FirstNameとLastNameが重複を示すために使用されていると仮定して、特定のPersonの両方のIDをリストするテーブルです。だから、基本的に私は取得しようとしています:

+---------------------------------------------------------+
|   ID   | OtherID | FirstName | LastName  | SomeOtherData|
+---------------------------------------------------------+
|  200   | 2091    | Robert    | Barone    | Foo          |
|  228   | 3921    | Doug      | Heffernan | Bar          |
|  291   |         | Greg      | Warner    | Barfoo       |
+---------------------------------------------------------+

誰かがこのようなことで私を助けることができるでしょうか?ありがとう!

4

1 に答える 1

2

PIVOTデータを行から列に変換するを使用できます。

select [1] Id,
  [2] OtherId,
  firstname, 
  lastname
from
(
  select id, firstname, lastname,
    row_number() over(partition by firstname, lastname
                      order by id) rn
  from yourtable
) src
pivot
(
  max(id)
  for rn in ([1], [2])
) piv

SQL FiddlewithDemoを参照してください

CASEまたは、次の式で集計関数を使用できます。

select 
  max(case when rn = 1 then id end) Id,
  max(case when rn = 2 then id end) OtherId,
  firstname,
  lastname
from
(
  select id, firstname, lastname,
    row_number() over(partition by firstname, lastname
                      order by id) rn
  from yourtable
) src
group by firstname, lastname

上記は、重複する値の数がわかっている場合(1、2など)にうまく機能します。IDが3つ以上ある場合は、動的SQLを実装することもできます。動的SQLは次のようになります。

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

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


select @colNames = STUFF((SELECT distinct ', ' + QUOTENAME(cast(row_number() over(partition by firstname, lastname order by id) as varchar(50))) +' as Id_' + cast(row_number() over(partition by firstname, lastname order by id) as varchar(50)) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ' + @colNames + ', firstname, lastname from 
             (
                select id, firstname, lastname,
                  row_number() over(partition by firstname, lastname
                                    order by id) rn
                from yourtable
            ) x
            pivot 
            (
                max(id)
                for rn in (' + @cols + ')
            ) p 
            '

execute(@query)

SQL FiddlewithDemoを参照してください

3つすべての結果は次のようになります。

|  ID | OTHERID | FIRSTNAME |  LASTNAME |
-----------------------------------------
| 200 |    2091 |    Robert |    Barone |
| 228 |    3921 |      Doug | Heffernan |
| 291 |  (null) |      Greg |    Warner |
于 2013-01-22T21:46:12.373 に答える