1

我使用 SQL 已经有一段时间了,但我还是个菜鸟,所以我来这里寻求帮助。我已经搜索了该站点,但没有完全找到我想要完成的任务。

我想使用 SQL 来获取两列,如下所示:

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 回答