SQL Server:在输出中的单个表中合并数据行

时间:2013-05-13 21:34:13

标签: sql sql-server join

我有一个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。

查询不应使用视图或创建其他表。

感谢您的帮助!

2 个答案:

答案 0 :(得分: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

答案 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'