Выражение Case из другого выражения case

#mysql #sql #select #case

#mysql #sql #выберите #регистр

Вопрос:

У меня есть образец кода SQL, который возвращает количество недель

 ,CASE       WHEN dateadd(MONTH, datediff (MONTH,AgentStart, getdate()), AgentStart) > getdate()
            THEN datediff(MONTH, AgentStart, getdate()) - 1
            ELSE datediff(MONTH, AgentStart, getdate())
            END as 'Month'
 

Я не думаю о том, как теперь я могу добавить новый столбец, который даст мне этот результат (из той же таблицы).:

 ,CASE       WHEN **MONTH FROM CASE STATEMENT ABOVE** BETWEEN 0 AND 3 THEN 'Youngest' 
            WHEN **MONTH FROM CASE STATEMENT ABOVE** BETWEEN 4 AND  5 THEN 'Young' 
            WHEN **MONTH FROM CASE STATEMENT ABOVE** BETWEEN 6 AND 11 THEN 'Medium' 
            ELSE 'Old'
            END AS "Status"
 

Комментарии:

1. Это выражения падежа, а не утверждения.

2. Используйте cte или производную таблицу для первого шага, затем примените второй шаг к его результату.

3. Пожалуйста, предоставьте свой полный запрос.

Ответ №1:

Вы могли бы использовать подзапрос:

 SELECT `month`,
        CASE WHEN `month` BETWEEN 0 AND 3 THEN 'Youngest' 
             WHEN `month` BETWEEN 4 AND  5 THEN 'Young' 
             WHEN `month` BETWEEN 6 AND 11 THEN 'Medium' 
             ELSE 'Old'
        END AS Status
FROM   (SELECT CASE  
               WHEN dateadd(MONTH, datediff (MONTH,AgentStart, getdate()), AgentStart) > getdate()
               THEN datediff(MONTH, AgentStart, getdate()) - 1
               ELSE datediff(MONTH, AgentStart, getdate())
               END as `Month`
       FROM    mytable) t
 

Ответ №2:

Вы можете написать встроенное представление, чтобы сделать это

Например:

 select case WHEN x.month_value BETWEEN 0 AND 3 THEN 'Youngest' 
            WHEN x.month_value  BETWEEN 4 AND  5 THEN 'Young' 
            WHEN x.month_value  BETWEEN 6 AND 11 THEN 'Medium' 
            ELSE 'Old'
            END AS "Status"
       ,--rest of the columns from the inner query...
  from (
    select CASE 
               WHEN dateadd(MONTH, datediff (MONTH,AgentStart, getdate()), AgentStart) > getdate()
                THEN datediff(MONTH, AgentStart, getdate()) - 1
                ELSE datediff(MONTH, AgentStart, getdate())
                END as month_value --naming it as month_value
    from <table>
       )x