2013-04-26 71 views
0

我正在尋找一些幫助,試圖將具有共同ID的多行與SQL Server組合成一行。這裏有一個例子:從一個表中組合多個行的SQL查詢

ID Name Number 
1 Joe 1234 
1 Marie 5678 
1 Ron 2222 
1 Tom 4444

希望查詢顯示此:

ID Name Number Name Number Name Number Name Number 
1 Joe 1234 Marie 5678 Ron 2222 Tom 4444
+0

結果集應顯示,如果你有另一行:'1 | Jimbo | 9999 |'?看起來像是一個非常古怪的結果。 – Yuck 2013-04-26 02:37:04

回答

1
with data as (
    select *, row_number() over (partition by ID order by ID) as rowid 
    from (
     values (1, 'Joe', 1234), 
       (1, 'Marie', 5678), 
       (1, 'Ron', 2222), 
       (1, 'Tom', 4444) 
    ) t (ID, Name, Number) 
) 
select t.ID, t.[1] as Name, t2.[1] as Number, t.[2] as Name, t2.[2] as Number, 
      t.[3] as Name, t2.[3] as Number, t.[4] as Name, t2.[4] as Number 
from (
    select ID, Name, rowid 
    from data 
) d pivot (min(Name) for rowid in ([1], [2], [3], [4])) t 
inner join (
    select ID, Number, rowid 
    from data 
) d2 pivot (min(Number) for rowid in ([1], [2], [3], [4])) t2 on t.ID = t2.ID 
1

我建議同時應用了UNPIVOT和PIVOT功能到得到結果。該UNPIVOT將您namenumber列轉換爲多行,那麼你將應用PIVOT函數來轉換回柱:

select * 
from 
(
    select id, 
    col+'_'+cast(rn as varchar(10)) col, 
    value 
    from 
    (
    select id, name, cast(number as varchar(10)) number, 
     row_number() over(partition by id order by number) rn 
    from yt 
) src 
    unpivot 
    (
    value 
    for col in (name, number) 
) unpiv 
) d 
pivot 
(
    max(value) 
    for col in (name_1, number_1, name_2, number_2, 
       name_3, number_3, name_4, number_4) 
) piv; 

SQL Fiddle with Demo。這給出了一個結果:

| ID | NAME_1 | NUMBER_1 | NAME_2 | NUMBER_2 | NAME_3 | NUMBER_3 | NAME_4 | NUMBER_4 | 
-------------------------------------------------------------------------------------- 
| 1 | Joe |  1234 | Ron |  2222 | Tom |  4444 | Marie |  5678 |