2013-03-08 158 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