2013-03-08 155 views
2

我已經從我查詢了我的結果是多行:SQL合併多行到一個多列

例如,表「地址」:

Street | Number | City 
---------------------- 
A1  | A2  | A3 
B1  | B2  | B3 

其實我要的是:

Address1_Street | Address1_Number | Address1_City | Address2_Street | Address2_Number | Address2_City 
------------------------------------------------------------------------------------------------------ 
A1    | A2    | A3   | B1    | B2    | B3 

任何人誰知道我可以做到這一點?

我已經成功地得到了這一點,現在(對不起,使用等欄目,在一個上面就是一個例子,但我猜你會得到點):

select distinct 
    a.ID, 
    a.Name, 
    ca1.NameLine1 as Address1_NameLine1, 
    ca2.NameLine1 as Address2_NameLine1 
from 
    dbo.Accounts a, 
    dbo.Addresses ca1, 
    dbo.Addresses ca2 
where 
     (a.ID = ca1.AccountID AND a.ID = ca2.AccountID) 
    AND (a.Name = 'TEST') 
    AND (ca1.ID <> ca2.ID) 

但我仍然得到2行... Address1與Address2交換。誰知道如何才能得到一個?謝謝!

+0

是有確定哪些行應該一起搗碎,或者你只是想在地址表中的每一行上'Address'的關鍵? – ninesided 2013-03-08 09:00:46

+0

在許多RDBMS中,無法爲任意數量的列執行此操作。 – 2013-03-08 09:04:38

+0

有我返回的MAX 2地址 – RubenHerman 2013-03-08 09:20:04

回答

4

嘗試:

select ID, 
     max(Name) Name, 
     max(case when rn=1 then NameLine1 end) Address1_NameLine1, 
     max(case when rn=2 then NameLine1 end) Address1_NameLine2 
from 
(select a.ID, 
     a.Name, 
     ca.NameLine1, 
     rank() over (partition by a.ID order by ca.ID) rn 
from dbo.Accounts a 
join dbo.Addresses ca on a.ID = ca.AccountID 
where a.Name = 'TEST') sq 
group by ID 
+0

工程就像一個魅力!謝謝:-) – RubenHerman 2013-03-08 10:18:56

+0

最後一個問題......有可能這個賬戶只有1個地址,我應該如何檢查? (所以Address2_NameLine1應該返回NULL) – RubenHerman 2013-03-08 10:21:35

+1

@RubenHerman:實際上,以前的版本在只有一個地址的情況下工作正常,但在有第二個地址的情況下返回了兩行 - 這個新版本應該對每個帳戶的一個或兩個地址有效。 – 2013-03-08 10:52:10

1
select address1.* ,address2.* from 
Address address1 inner join on Address address2 
on address1.userid=address2.userid 

您可以根據數據選擇內連接或左連接。

+0

而這隻返回一行呢? – RubenHerman 2013-03-08 09:15:07

+0

您可以選擇左連接而不是內連接。 – shola 2013-03-08 09:34:52