Запрос SQL Server 2014 с несколькими условиями - PullRequest
0 голосов
/ 23 мая 2018

У меня есть запрос SQL с несколькими условиями, для данного источника (перечислены ниже) мне нужно получить результирующий набор как Окончательный (перечислены ниже) со следующим условием:

  • Условие01: Для активного сайта контакт с «RO» в качестве роли контакта должен быть взят
  • Условие 02: Для неактивного сайта, контакт с «Владельцем» в качестве роли контакта должен быть взят
  • Условие03: Если активный сайт не имеет контакта с «RO» в качестве роли контакта, то следует взять контакт с «Владельцем» в качестве роли контакта.
  • Условие 04: Если неактивный сайт не имеет контакта с«Владелец» в качестве роли контакта, затем следует взять контакт с «RO» в качестве роли контакта.
  • Условие 05: если активный сайт / неактивный не имеет контакта с «RO» или «Владельцем»в качестве роли контакта, затем следует взять контакт с «Оператором» в качестве роли контакта

  • Условие 06: Только для активного сайта следует избегать контакта «XYZ» с «RO» в качестве роли контакта и выбрать другуюсвязаться с 'Контактная роль RO, если на сайте нет «RO», выберите «Владелец» или «Оператор» в качестве контактной роли

  • Условие 07: Если сайт (активен / неактивен)) не имеет никаких контактов, тогда эти сайты должны иметь значения NULL в поле контакта.

Можем ли мы включить все вышеперечисленные условия в один запрос (без подзапросов, если это возможно)) как оригинальные записи набора данных больше 20К?

Source 
======

Site_Status Site_id  Site_Contact  Contact Role 
Active      123      Lilly         Owner
Active      123      Elan          RO
Inactive    345      Rose          Owner
Inactive    345      Jack          RO
Active      678      Robert        Owner 
Inactive    912      Linda         RO
Active      234      Nike          Operator 
Inactive    456      Frank         Operator
Active      808      XYZ           RO
Active      808      Kelly         Owner
Active      999      XYZ           RO
Active      999      Debbi         Operator 
Active      122                
Inactive    188              


Final
======
Site_Status Site_id Site_Contact    ContactRole
Active      123     Elan            RO
Inactive    345     Rose            Owner
Active      678     Robert          Owner
Inactive    912     Linda           RO
Active      234     Nick            Operator
Inactive    456     Frank           Operator
Active      808     Kelly           Owner
Active      999     Debbi           Operator 
Active      122     NULL            NULL
Inactive    188     NULL            NULL

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вы можете использовать табличную переменную и заполнять ее постепенно, но это не будет отдельный запрос (это кандидат ggod для хранимой процедуры).Один запрос с подзапросами может быть создан с помощью объединения (довольно большой):

select * from [Source]
where [Contact Role] = 'RO' and Site_Status = 'Active'
union
select * from [Source]
where [Contact Role] = 'Owner' and Site_Status = 'Inactive'
union
select * from [Source] s1
where [Contact Role] = 'Owner' and Site_Status = 'Active'
and not exists(
    select 1 from [Source] s2 where s1.Site_Id = s2.Site_id 
    and s2.Site_Status = 'Active' and s2.[Contact Role] = 'RO'
)
union
select * from [Source] s1
where [Contact Role] = 'RO' and Site_Status = 'Inactive'
and not exists(
    select 1 from [Source] s2 where s1.Site_Id = s2.Site_id 
    and s2.Site_Status = 'Inactive' and s2.[Contact Role] = 'Owner'
)
union
select * from [Source] s1
where [Contact Role] = 'Operator'
and not exists(
    select 1 from [Source] s2 where s1.Site_Id = s2.Site_id 
    and (s2.[Contact Role] = 'Owner' or s2.[Contact Role] = 'RO')
)
0 голосов
/ 24 мая 2018

Примерно так ... с использованием оконной функции и условной сортировки.

declare @YourTable table (Site_Status varchar(64), Site_id int, Site_Contact varchar(64), ContactRole varchar(64))
insert into @YourTable
values
('Active',123,'Lilly','Owner'),
('Active',123,'Elan','RO'),
('Inactive',345,'Rose','Owner'),
('Inactive',345,'Jack','RO'),
('Active',678,'Robert','Owner'),
('Inactive',912,'Linda','RO'),
('Active',234,'Nick','Operator'),
('Inactive',456,'Frank','Operator')

select
    t.*
from @YourTable t
inner join
    (select 
        Site_id
        ,Site_Status
        ,ContactRole
        ,Active = row_number() over (partition by Site_id, Site_Status order by case 
                                                                                    when Site_Status = 'Active' and ContactRole = 'RO' then 1
                                                                                    when Site_Status = 'Active' and ContactRole = 'Owner' then 2
                                                                                    when Site_Status = 'Active' and ContactRole = 'Operator' then 3
                                                                                end)
        ,InActive = row_number() over (partition by Site_id, Site_Status order by case
                                                                                    when Site_Status = 'InActive' and ContactRole = 'Owner' then 1
                                                                                    when Site_Status = 'InActive' and ContactRole = 'RO' then 2
                                                                                    when Site_Status = 'InActive' and ContactRole = 'Operator' then 3
                                                                                end)
    from @YourTable) x on 
    x.Site_id = t.Site_id 
    and x.Site_Status =  t.Site_Status 
    and t.ContactRole = x.ContactRole 
    and Active = 1 
    and InActive = 1
...