2017-02-15 3 views
0

Я использую оператор CASE для создания столбца Quoted. Таким образом, он отобразит значение 1 или 0.Как написать вложенный оператор CASE на основе запроса ниже?

Но тогда столбец DisplayStatus должен быть создан на основе состояния предыдущего столбца Quoted.

Похоже, что в этой ситуации я должен использовать вложенный оператор CASE. Но я не могу найти правильный запрос.

SELECT 
     case when isnull(grouptt.controlno,0) <>0 AND isnull(vwR.Premium,0) > 0 then 
     cast(1 as bit) 
     else cast(0 as bit) 
     end as Quoted, 

     CASE 
      WHEN a.DisplayStatus = 'LOST' AND quoted=1 THEN 'Quoted_Lost' 
      WHEN a.DisplayStatus = 'DECLINED' AND quoted=1 THEN 'Quoted_NotTakenUp' 
      WHEN a.DisplayStatus = 'NOT TAKEN UP' AND quoted=1 THEN 'Quoted_Lost' 
      ELSE 
        a.DisplayStatus 
     END 
     DisplayStatus 
    FROM MyTable 
+0

Совет: Я считаю полезным использовать 'declare @False как бит = 0, @True как бит = 1;' для обеспечения «постоянных» значений, которые легко читать. – HABO

ответ

1

Используйте вложенную CASE выражение

SELECT 
    CASE 
     WHEN ISNULL(grouptt.controlno, 0) <> 0 AND ISNULL(vwR.Premium, 0) > 0 THEN CAST(1 AS BIT) 
     ELSE CAST(0 AS BIT) 
    END AS Quoted, 
    CASE 
     WHEN ISNULL(grouptt.controlno, 0) <> 0 AND ISNULL(vwR.Premium, 0) > 0 THEN 
      CASE 
        WHEN a.DisplayStatus = 'LOST' THEN 'Quoted_Lost' 
        WHEN a.DisplayStatus = 'DECLINED' THEN 'Quoted_NotTakenUp' 
        WHEN a.DisplayStatus = 'NOT TAKEN UP' THEN 'Quoted_Lost' 
        ELSE a.DisplayStatus 
      END 
     ELSE a.DisplayStatus 
    END AS DisplayStatus 
FROM MyTable 
+0

Спасибо! Это именно то, что мне нужно. Единственное, похоже, что вы пропустили «THEN» в секретном заявлении CASE – Oleg

1

Вы не можете повторно использовать переменную в одном select. Два общих метода для адресов - это CTE и подзапросы. Я также хотел третий, outer apply:

SELECT v.quoted, 
     (CASE WHEN a.DisplayStatus = 'LOST' AND v.quoted = 1 THEN 'Quoted_Lost' 
       WHEN a.DisplayStatus = 'DECLINED' AND v.quoted = 1 THEN 'Quoted_NotTakenUp' 
       WHEN a.DisplayStatus = 'NOT TAKEN UP' AND v.quoted = 1 THEN 'Quoted_Lost' 
       ELSE a.DisplayStatus 
     END) 
FROM MyTable t OUTER APPLY 
    (VALUES (case when coalesce(grouptt.controlno,0) <> 0 AND coalesce(vwR.Premium, 0) > 0 
        then cast(1 as bit) 
        else cast(0 as bit) 
       end) 
    ) v(Quoted); 
1

вы можете попробовать использовать кросс применять calcuating в stamement к значению.

SELECT 
    c.Quoted, 

    CASE 
     WHEN a.DisplayStatus = 'LOST' AND c.quoted=1 THEN 'Quoted_Lost' 
     WHEN a.DisplayStatus = 'DECLINED' AND c.quoted=1 THEN 'Quoted_NotTakenUp' 
     WHEN a.DisplayStatus = 'NOT TAKEN UP' AND c.quoted=1 THEN 'Quoted_Lost' 
     ELSE 
       a.DisplayStatus 
    END 
    DisplayStatus 
FROM MyTable AS a 
CROSS APPLY(VALUES(
    CASE when isnull(grouptt.controlno,0) <>0 AND isnull(vwR.Premium,0) > 0 then 
    cast(1 as bit) 
    else cast(0 as bit) 
    end) 
) c(Quoted) 
Смежные вопросы