2013-05-13 38 views
1

我有以下字段和樣本數據SQL Server表:SQL Server的:合併數據行中單個表中輸出

ID   Name Address Age 
23052-PF Peter Timbuktu 25 
23052-D1 Jane Paris  22 
23052-D2 David London 24 
23050-PF Sam Beijing 22 
23051-PF Nancy NYC  26 
23051-D1 Carson Cali  22 
23056-PF Grace LA  28 
23056-D1 Smith Boston 23 
23056-D2 Mark Adelaide 26 
23056-D3 Hose Mexico 25 
23056-D4 Mandy Victoria 24 

與-PF每個ID是表中唯一的。

帶-Dx的每個ID與-PF具有相同的ID。

帶有-PF的每個ID可以具有0個或更多個具有-Dx的ID。

對於給定的-PF -Dx的最大行數爲9

即一個ID 11111-PF可具有11111-D1,11111-D2,11111-D3高達11111-D9。

輸出預計上述樣本數據:

ID  ID (without suffix) PF_Name PF_Address PF_Age D_Name D_Address D_Age 
23052-PF 23052    Peter Timbuktu 25  Jane  Paris  22 
23052-PF 23052    Peter Timbuktu 25  David London  24 
23050-PF 23050    Sam  Beijing  22  NULL  NULL  NULL 
23051-PF 23051    Nancy NYC   26  Carson Cali  22 
23056-PF 23056    Grace LA   28  Smith Boston  23 
23056-PF 23056    Grace LA   28  Mark  Adelaide 26 
23056-PF 23056    Grace LA   28  Hose  Mexico  25 
23056-PF 23056    Grace LA   28  Mandy Victoria 24 

我需要能夠加入-PF和-Dx如上。

如果一個-PF有0個Dx行,那麼輸出中的D_Name,D_Address和D_Age列應該返回NULL。

如果一個-PF有一個或多個Dx行,那麼PF_Name,PF_Address和PF_Age應該重複輸出中的每一行和D_Name,D_Address和D_Age應該包含每個相關Dx行的值。

需要使用MSSQL。

查詢不應該使用視圖或創建其他表。

感謝您的幫助!

+0

看看樞聲明 – fnostro 2013-05-13 21:39:43

+0

表架構被打破。 PF/D1/D2應該有它自己的專欄 – 2013-05-13 21:47:30

+0

@JoelCoehoorn:沒有損壞,在這裏工作得很好。你可以爭論當然的設計選擇,但它本身不會被破壞。 – 2013-05-13 21:57:41

回答

1
select 
    pf.ID, 
    pf.IDNum, 
    pf.Name as PF_Name, 
    pf.Address as PF_Address, 
    pf.Age as PF_Age, 
    dx.Name as D_Name, 
    dx.Address as D_Address, 
    dx.Age as D_Age 

from 

(
select 
    ID, left(ID, 5) as IDNum, Name, Address, Age 

from 
    mytable 

where 
    right(ID, 3) = '-PF' 
) pf 

left outer join 

(
select 
    ID, left(ID, 5) as IDNum, Name, Address, Age 

from 
    mytable 

where 
    right(ID, 3) != '-PF' 
) dx 

on pf.IDNum = dx.IDNum 

SqlFiddle演示:http://sqlfiddle.com/#!6/dfdbb/1

0
SELECT t1.ID, LEFT(t1.ID,5) "ID (without Suffix)", 
    t1.Name "PF_Name", t1.Address "PF_Address", t1.Age "PF_Age", 
    t2.Name "D_Name", t2.Address "D_Address", t2.Age "D_Age" 
FROM PFTable t1 
LEFT JOIN PFTable t2 on LEFT(t1.ID,5) = LEFT(t2.ID,5) 
WHERE RIGHT(t1.ID,2) = 'PF' 
+0

它不會爲具有23050-PF Id的行在右側返回空值。 – 2013-05-13 22:02:38

+0

@zespri Opps。至少這是一個簡單的修復。 – 2013-05-13 22:44:55

+0

仍是同樣的問題。發帖之前是否嘗試過? – 2013-05-14 04:15:18