2011-08-25 45 views
1

今天我遇到了这个障碍。也许由于缺乏睡眠/咖啡,我无法弄清楚如何避开。TSQL - 为每个客户将不同行上的地址转换为一行

我们需要一个查询来查看地址表,并为同一个客户返回一行中的交付地址和帐单地址。

表格结构当然大大简化,只包含相关的列。

地址表:

CustID Address   AddressType 
----------------------------------- 
1  3 Marsh Road  D 
1  5 Bog Street  B 
2  4 Peat Close  D 
3  1 Swamp Crescent D 
3  5 Moor Avenue B 
4  6 Wetland Place D 

主键是(CUSTID,地址类型)。 AddressType值:D =传送地址; B =帐单地址。每个CustID都有一个递送地址,但不是每个人都有一个账单地址。

现在我想要实现的是通过基于查询的地址类型字段转换上面到下面,让我们有这个(如果没有发票,然后利用送货地址):

CustID DelAddress  BillAddress 
--------------------------------------- 
1  3 Marsh Road  5 Bog Street 
2  4 Peat Close  4 Peat Close 
3  1 Swamp Crescent 5 Moor Avenue 
4  6 Wetland Place 6 Wetland Place 

回答

5

LEFT OUTER JOIN会在A和B中存在某种东西时为您提供帮助。加入地址表两次,一次用于传递,一次用于可选结算。用COALESCE用其他东西代替空值

SELECT 
    CustID 
, D.Address AS DelAddress 
, COALESCE(B.Address, D.Address) AS BillAddress 
FROM 
    ADDRESS D 
    LEFT OUTER JOIN 
     ADDRESS B 
     ON B.CustId = D.CustId 
     AND B.AddressType = 'B' 
WHERE 
    D.AddressType = 'D' 
+0

不错而且简单。谢谢。 – deutschZuid