1

私はしばらく SQL を使用してきましたが、まだ初心者なので、助けを求めてここに来ています。私はすでにサイトを検索しましたが、達成しようとしているものがまったく見つかりませんでした.

SQL を使用して、次のような 2 つの列を取得したいと考えています。

VisitNumber ID
39332       759666
39332       769445
39332       775795
40329       762595
40329       769447
40329       775796
40329       783782
39332       783781
39332       861130

これに:

VistNumber  ID1 ID2 ID3 ID4 ID5
39332       759666  769445  775795  783781  861130
40329       762595  769447  775796  783782  NULL

PIVOT を使用することを考えていましたが、Count()、Min()、Max() などを使用していないため、ピボット部分を正確に行う方法がわかりません。ヘルプ/提案をいただければ幸いです。

4

2 に答える 2

2

SQL Server を使用しているため、結果を取得する方法はいくつかありますが、そのすべてにrow_number().

CASE 式で集計関数を使用できます。

select visitnumber,
  max(case when seq=1 then id end) ID1,
  max(case when seq=2 then id end) ID2,
  max(case when seq=3 then id end) ID3,
  max(case when seq=4 then id end) ID4,
  max(case when seq=5 then id end) ID5
from
(
  select visitnumber, id,
    row_number() over(partition by visitnumber 
                      order by id) seq
  from yourtable
) d
group by visitnumber;

デモで SQL Fiddle を参照してください

PIVOT 関数を使用できます。

select visitnumber, ID1, ID2, ID3, ID4, ID5
from
(
  select visitnumber, id,
    'ID'+cast(row_number() over(partition by visitnumber 
                                order by id) as varchar(10)) seq
  from yourtable
) d
pivot
(
  max(id)
  for seq in (ID1, ID2, ID3, ID4, ID5)
) piv;

SQL Fiddle with Demoを参照してください。最大 5 つの ID しか持てないと述べましたが、番号が不明な場合は、動的 SQL を使用して結果を取得できます。

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

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

set @query = 'SELECT visitnumber,' + @cols + ' 
            from 
            (
               select visitnumber, id,
                  ''ID''+cast(row_number() over(partition by visitnumber 
                                              order by id) as varchar(10)) seq
               from yourtable
            ) x
            pivot 
            (
                max(id)
                for seq in (' + @cols + ')
            ) p '

execute sp_executesql @query;

SQL Fiddle with Demoを参照してください。すべてのバージョンで結果が得られます。

| VISITNUMBER |    ID1 |    ID2 |    ID3 |    ID4 |    ID5 |
------------------------------------------------------------
|       39332 | 759666 | 769445 | 775795 | 783781 | 861130 |
|       40329 | 762595 | 769447 | 775796 | 783782 | (null) |
于 2013-07-30T13:48:03.013 に答える
0
with CTE as
(

select t.VisitNumber,
       t.Id,
       ROW_NUMBER() over (PARTITION BY VisitNumber 
                          ORDER BY ID) rn
from t
)

SELECT VisitNumber, 
[1], [2], [3], [4],[5]
FROM CTE
PIVOT
(
AVG(ID)
FOR RN IN ([1], [2], [3], [4],[5])
) AS PivotTable

SQLFiddle デモ

于 2013-07-30T13:51:53.330 に答える