Есть ли какая-либо функция, которая уменьшит размер моего запроса при использовании "CASE" - PullRequest
1 голос
/ 06 мая 2019

Мне нужно получать и отображать ежемесячные данные в одном отчете, в настоящее время я использую функцию CASE для получения значения, основанного на месяце.Есть ли какая-либо другая функция, которая сделает мой запрос более оптимизированным

select MONTH(sale_date) AS MOIST,CASE WHEN MONTH(sale_date) = 1  THEN A 
                                      WHEN MONTH(sale_date) = 2 THEN B 
                                      WHEN MONTH(sale_date) = 3 THEN C
                                      WHEN MONTH(sale_date) = 4 THEN  D 
                                      else E 
                                 END as value

Есть ли какая-то причина, чтобы сделать все еще простым и оптимизированным

Ответы [ 2 ]

3 голосов
/ 06 мая 2019

Вы можете использовать альтернативный синтаксис для case:

select MONTH(sale_date) AS MOIST,
       (CASE MONTH(sale_date)
            WHEN 1 THEN A 
            WHEN 2 THEN B 
            WHEN 3 THEN C
            WHEN 4 THEN D 
            ELSE E 
        END) as value

Вы также можете использовать OUTER APPLY:

select month(sale_date),
       coalesce(v.val, E)
from . . . outer apply
     (select val
      from (values (1, A), (2, B), (3, C), (4, D)
           ) v(mon, val)
      where v.mon = month(sale_date)
     ) v

Или LEFT JOIN:

select month(sale_date),
       coalesce(v.val, E)
from . . . left join
     (values (1, A), (2, B), (3, C), (4, D)
     ) v(mon, val)
     on v.mon = month(sale_date)
2 голосов
/ 06 мая 2019

Если вы имеете в виду «A», «B», «C», «D», то:

select MONTH(sale_date) AS MOIST,CASE WHEN MONTH(sale_date) <= 4  THEN CHAR(MONTH(sale_date) + 64) 
                                      else E 
                                 END as value

Если значения являются чем-то другим, и вы можете найти какой-нибудь удобный шаблон, как указано выше, используйте его. Если нет, то реализуйте сохраненную функцию, которая получает 1, 2, 3 или 4 в качестве параметра и возвращает правильное значение, например:

select MONTH(sale_date) AS MOIST,CASE WHEN MONTH(sale_date) <= 1  THEN myFunction(sale_date) 
                                      else E 
                                 END as value

или даже:

select MONTH(sale_date) AS MOIST,myFunction(sale_date) as value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...