2014-10-16 3 views
0

У меня есть таблица собственности, в которой каждый владелец земли имеет отдельную запись. Чтобы создать более эффективные почтовые программы, мы хотим создать представление, которое может сочетать совместное владение супругами. Супруги имеют одинаковый номер клиента, однако у них есть отдельный код адреса для разграничения между отдельными лицами. Каждое свойство имеет одного основного владельца и может иметь любое количество вторичных владельцев. Мне нужно сгруппировать владельцев собственности (PID) с тем же номером клиента и включить те, у которых есть отдельный номер.Присоединиться к данным из одной таблицы

Для примера:

╔══════════╦═══════════╦══════════╦════════════╦════════════╗ 
║ PID  ║ OwnerName ║ OwnerType║CustomerNum ║AdressCode ║ 
╠══════════╬═══════════╬══════════╬════════════╬════════════╣ 
║ 100  ║Smith,John ║Primary ║SMI001  ║ 01  ║ 
║ 100  ║Smith,Jane ║Secondary ║SMI001  ║ 02  ║ 
║ 100  ║Smith,Dave ║Secondary ║SMI002  ║ 01  ║ 
║ 150  ║Jones,Rob ║Primary ║JON001  ║ 01  ║ 
╚══════════╩═══════════╩══════════╩════════════╩════════════╝ 

Должен иметь выход как:

╔══════════╦═══════════╦══════════╦════════════╗ 
║ PID  ║OwnerName1 ║OwnerName2║CustomerNum ║ 
╠══════════╬═══════════╬══════════╬════════════╣ 
║ 100  ║Smith,John ║Smith,Jane║SMI001  ║ 
║ 100  ║Smith,Dave ║   ║SMI002  ║ 
║ 150  ║Jones,Rob ║   ║JON001  ║ 
╚══════════╩═══════════╩══════════╩════════════╝ 

я использовал следующий запрос:

Select 
    O1.PID as PID, 
    O1.OwnerName as OwnerName1, 
    O2.OwnerName as OwnerName2, 
    O1.CustomerNum 
From ownertable O1 left outer join 
    ownertable O2 on O1.PID = O2.PID 
Where O1.CustomerNum = o2.CustomerNum AND O1.OwnerType = 'Primary Owner' 

Запрос кажется скопировать имя владельца в оба поля имени, когда нет вторичного владельца, а также создают дублируемую запись, инвертирующую OwnerNa me1 и OwnerName2. Я не уверен, что изменить в моем запросе, чтобы исправить эту проблему.

ответ

1

попробовать это один:

Select pid, 
     IsNull(max(case when AdressCode = '01' then OwnerName end), '') as OwnerName1, 
     IsNull(max(case when AdressCode = '02' then OwnerName end), '') as OwnerName2, 
     customernum 
from ownertable 
group by pid, customernum 
Order BY pid, customernum 
0

Похоже, вы пытаетесь получить результат PIVOT. Одним из вариантов является использование MAX и CASE для этого:

select pid, 
    max(case when ownertype='Primary' then OwnerName end) OwnerName1, 
    max(case when ownertype='Secondary' then OwnerName end) OwnerName2, 
    customernum 
from ownertable 
group by pid, customernum 

Если порядок имеет значение (где иногда Secondary должен быть OwnerName1 как с Smith,Dave), вы можете использовать row_number:

with cte as (
    select pid, ownername, ownertype, customernum, 
    row_number() over (partition by pid, customernum 
         order by ownertype) rn 
    from ownertable 
) 
select pid, 
    max(case when rn = 1 then OwnerName end) OwnerName1, 
    max(case when rn = 2 then OwnerName end) OwnerName2, 
    customernum 
from cte 
group by pid, customernum