2017-02-15 5 views
0

Quotedを作成するにはCASEステートメントを使用しています。したがって、値1または0が表示されます。以下のクエリに基づいてネストされたCASE文を書く方法はありますか?

ただし、前の列Quotedの条件に基づいて列DisplayStatusを作成する必要があります。

このような状況では、ネストされた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

ヒント:私は、ビット= 1としてビット= 0、@Trueとして@Falseを宣言 '使用することが参考;'読みやすい「定数」の値を提供します。 – HABO

答えて

1

あなたは同じselectで変数を再使用することはできませんネストされた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

ありがとう!それはまさに私が必要とするものです。唯一の事は、あなたがセコーン 'CASE'ステートメントで 'THEN'を逃したように思えます – Oleg

1

を使用してください。これに対処する2つの一般的な方法は、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

あなたはクロス値にstamementをcalcuating適用使用しようとすることができます。

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) 
関連する問題