2016-07-11 3 views
1

Допустим, у меня есть эта таблица (это упрощено, конечно, есть и другие столбцы):T-SQL возвращает строку, если другая строка не существует

CompanyID (int) 
ContactName (varchar(50)) 
ContactType (char(1)) 

со значениями:

CompanyID | ContactName   | ContactType 
----------------------------------------------- 
1   | John Doe    | A 
1   | Jane Smith   | B 
2   | Ralph Jones   | B 
3   | Dick Grayson   | A 

Я хочу, чтобы все компании, в которых есть ContactType = 'A', если нет ContactType = 'A', возвращайте ContactType = 'B'. Таким образом, в этом примере, я хочу:

1, John Doe (because he's a ContactType A) 
2, Ralph Jones (because Company #2 doesn't have a ContactType A) 
3, Dick Grayson (because he's a ContactType A) 

Я не могу просто сказать: «А или В», потому что компания может иметь и другое.

Вот что я пытался (и не)

use MyFancyDatabase 
drop table #TypeA 
drop table #TypeB 
drop table #TypeAB 

create table #TypeA(ownerkey int, ContactName varchar(200), ContactType char(1)) 
insert #TypeA 
Select ownerkey, ContactName, ContactType from address 
where ContactType = 'A' and CancelDate is null 

create table #TypeB(ownerkey int, ContactName varchar(200), ContactType char(1)) 
insert #TypeB 
Select ownerkey, ContactName, ContactType from address 
where ContactType = 'B' and CancelDate is null 

create table #TypeAB(ownerkey int, ContactName varchar(200), ContactType char(1)) 
insert #TypeAB 

select * from #TypeA 
except 
select * from #TypeB 

Я думаю, на английском языке, это «А, но если нет А, а затем взять B.»

Любые предложения?

+0

попробовать 'сливаются()', может быть. –

ответ

1
SELECT a.OwnerKey, a.CompanyName, Case WHEN a.ContactType IS NULL THEN b.ContactType ELSE a.ContactType END AS ContactType 
FROM #TypeA a 
LEFT JOIN #TypeB b on a.OwnerKey = b.OwnerKey 
+0

Короткие и сладкие. Я получил результаты, которые я искал, спасибо. – Duston

1

Я думаю, что это должно сработать для вас.

with SortedResults as 
(
    select CompanyID 
     , ContactName 
     , ContactType 
     , ROW_NUMBER() over (partition by CompanyID order by ContactType) as RowNum 
    from ThisTable 
) 

select * 
from SortedResults 
where RowNum = 1 
0

Попробуйте SQL

Select t1.CompanyID , 
     ContactName = IIF(t1.ContactType='A',t1.ContactName,t2.ContactName) 
     ContactType = IIF(t1.ContactType='A','A',t2.ContactType) 
FROM address as t1 left join address as t2 
    on t1.CompanyID = t2.CompanyID 
    AND t1.ContactName = t2.ContactName 
    AND (t1.ContactType <> t2.ContactType) 

Если у вас есть больше типа, чем А или В, и вы хотите только А и B добавить это на где Постулаты

WHERE (t1.ContactType = 'A' OR t1.ContactType = 'B') 
    AND (t2.ContactType = 'A' OR t2.ContactType = 'B') 
0

столбцы в вашей определенной таблице не совпадают с столбцами в вашем примере запроса. Я предполагаю, что OwnerKey - это то же самое, что и CompanyID?

Если это так, и вы сохранить большую часть остальной части кода, последний выбор должен был бы быть:

select * from #TypeA 
union all 
select * from #TypeB 
where not exists (
    select * 
    from #TypeA 
    where #TypeA.ownerkey = #TypeB.ownerkey) 
Смежные вопросы