多行数据到单行(值不标准)

d0h*_*d0h 2 sql t-sql pivot sql-server-2008

这是我的问题:

我有一个名称和地址表,例如

Name  |  Address       | Updated
----------------------------------
a     |  12 lane       | 1/1/2011
b     |  34 avenue     | 1/1/2011
c     |  56 district   | 1/1/2011
a     |  78 avenue     | 8/8/2011
b     |  90 lane       | 8/8/2011
a     |  83 district   | 9/9/2011
a     |  39 road       | 10/10/2011
Run Code Online (Sandbox Code Playgroud)

如您所见,人们可能拥有多个地址.假设一个人拥有的最大地址数为5.

我只对每个人获得最新的3个地址感兴趣,这样表格看起来像:

Name  |  Address_1      |   Address_2       |  Address_3
--------------------------------------------------------------
a     | 78 avenue       |   83 district     | 39 road
b     | 34 avenue       |   90 lane         | NULL
c     | 56 district     |   NULL            | NULL
Run Code Online (Sandbox Code Playgroud)

请注意,不会出现第一个条目"12 lane"

我一直在阅读stackoverflow上显示的其他示例,但我不确定Pivot表是否适合我需要的,因为地址都是不同的

提前感谢您提供的任何帮助!

Nik*_*vić 6

你可以转动它.关键点是按更新的降序将row_numbers分配给地址.这会产生列名称1,2和3(以及4,5 - 但这些将被pivot命令忽略).

这是Sql Fiddle的例子.

select name, 
       [1] Address_1,
       [2] Address_2,
       [3] Address_3
from
(
  select name,
         address,
         row_number() over (partition by name
                            order by updated desc) rn
    from table1
) o
pivot (min(address) for rn in ([1], [2], [3])) p
Run Code Online (Sandbox Code Playgroud)