SQL устанавливает несколько значений в одном выражении перекрестного применения / случая

Я пытаюсь очистить запрос ниже. В первом перекрестном применении я оцениваю [Store Number] и [Branch Number] и возвращаю [Store Name], затем в следующих трех перекрестных применениях я использую это [Store Name] для возврата значений по отдельности для [Phone Number], [Contact Name] и [Contact Title]. Есть ли способ установить и вернуть все три этих значения только в одном дополнительном перекрестном применении/случай?

SELECT

       C.[Store Number]
       ,B.[Store Name]
       ,PH.[Phone Number]
      ,CN.[Contact Name]
      ,CT.[Contact Title]
  FROM [Central_Account] C 

      cross apply (select[Store Name] = case C.[Store Number]
                                 when 9146 then
                                    case
                                          when C.[Branch Number] In (14, 16, 18)
                                          then 'Community Store'
                                    end  
                                 when 8147 Then 
                                    case
                                          when C.[Branch Number] In (24, 26, 28)
                                          then 'City Store'
                                    end
                                 when 7148 Then 
                                   case
                                          when C.[Branch Number] In (34, 36, 38)
                                          then 'County Store'
                                   end
                                 else
                                    'State Store'
                           end )as B
        cross apply (select [Phone Number] = case B.[Store Name]
                       when 'Community Store' Then
                                      '414.882.8278'       
                                 when 'City Store' Then
                                      '221.332.6221'
                                 when 'County Store' Then
                                    '211.949.2008'
                                 else
                                    '635.588.1878'
                           end ) as PH                        
      cross apply (select [Contact Name] = case B.[Store Name]
                                when 'Community Store' Then
                                      'John A. Smith'      
                                 when 'City Store' Then
                                      'Marcus D. Jones'
                                 when 'County Store' Then
                                      'Mica L. Johnson'
                                 else
                                      'Elroy Watkins, Jr.'
                           end ) as CN   
        cross apply (select [Contact Title] = case B.[Store Name]
                                when 'Community Store' Then
                                      'Executive Vice President'      
                                 when 'City Store' Then
                                      'Manager'
                                 when 'County Store' Then
                                      'President of Operations'
                                 else
                                      'Clerk'
                           end ) as CT   

person MaP    schedule 10.06.2018    source источник
comment
Уф, все эти CASE. Вы должны хранить эти данные (например, номер телефона магазина) в таблицах и объединять их. Не храните данные в запросах.   -  person sticky bit    schedule 11.06.2018
comment
Согласованный. . .эта информация уже должна где-то храниться. Не уверен, почему запрос не извлекается из источников таблиц. Будет копать немного дальше. Спасибо!   -  person MaP    schedule 11.06.2018


Ответы (1)


Я склонен относиться к этому как к join.

select C.[Store Number], sn.Store_Name, 
       v.phone_number, v.contact_name, v.contact_title
from Central_Account C cross apply
     (values (case when C.[Store Number] = 9146 and C.[Branch Number] In (14, 16, 18)
                   then 'Community Store'
                   when C.[Store Number] = 8147 and C.[Branch Number] In (24, 26, 28)
                   then 'City Store'
                   when C.[Store Number] = 7148 and C.[Branch Number] In (34, 36, 38)
                   then 'County Store'
                   when C.[Store Number] not in (9146, 8147, 7148)
                   then 'State Store'
              end)
     ) sn(store_name) join
     (values ('Community Store', '414.882.8278', 'John A. Smith', 'Executive Vice President'), 
             ('City Store', '221.332.6221', 'Marcus D. Jones',  'Manager'),
             ('County Store', '211.949.2008', 'Mica L. Johnson', 'President of Operations'),
             ('State Store', '635.588.1878', 'Elroy Watkins, Jr.', 'Clerk')
     ) v(store_name, phone_number, contact_name, contact_title)
     on sn.store_name = v.store_name or
        (sn.store_name is null and v.store_name = 'State Store';  

Первый cross apply получает имя магазина. Затем второй values вводит всю необходимую информацию о магазине. Есть небольшая хитрость со значениями по умолчанию — потому что некоторые имена магазинов NULL, как вы настроили логику. Это просто по умолчанию для хранилища состояний.

person Gordon Linoff    schedule 11.06.2018
comment
Это сработало отлично - красиво и чисто! Спасибо за помощь! ***** - person MaP; 12.06.2018