2013-05-13 1 views
1

У меня есть таблица SQL Server со следующими полями данных и выборки:SQL-сервер: Слияние строк данных в одной таблице на выходе

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 является уникальным в таблице.

Каждый идентификатор с -Dx связан с тем же идентификатором с -PF.

Каждый идентификатор с -PF может иметь 0 или более идентификаторов с -Dx.

Максимальное количество строк -dx для данного -pf равно 9.

т.е. идентификатор 11111-ПФ может иметь 11111-D1, D2-11111, 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, как указано выше.

Если a -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

+0

Схема таблицы сломана. PF/D1/D2 должен иметь собственный столбец –

+0

@JoelCoehoorn: не сломан, работает отлично. Конечно, вы можете поспорить с выбором дизайна, но он сам по себе не разбит. –

ответ

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. –

+0

@zespri Opps. По крайней мере, это простое решение. –

+0

По-прежнему та же проблема. Вы пытались это сделать до публикации? –