2012-01-04 6 views
3

私は、インサートをやっているし、次のように私は挿入てるの値のいずれかが計算されます。クエリー内のクリーナーケースステートメント?

SUM(Value1)/(
    CASE SUM(
     CASE Value2 > 0 
     THEN 1 
     ELSE 0 
     END 
    ) = 0 
    THEN 1 
    ELSE SUM(
     CASE Value2 > 0 
     THEN 1 
     ELSE 0 
     END 
    ) 
) 

インナーCASE -partが二回重複している、エイリアスまたは変数に設定するとよいでしょう代わりにその別名や変数を使用してください。

+0

SQLの味は? CommonTableExpressonsを使用できますか? – MatBailie

+0

「WHEN」が欠落しているようです。 –

答えて

1

CTEの答えは...

WITH 
    step1 AS 
(
    SELECT 
    SUM(value1)       AS interimValue1 
    SUM(CASE value2 > 0 THEN 1 ELSE 0 END) AS interimValue2, 
    <other fields> 
    FROM 
    <a query> 
) 
SELECT 
    interimValue/CASE interimValue2 = 0 THEN 1 ELSE interimValue2 END 
FROM 
    step1 


サブクエリのバージョン...

SELECT 
    interimValue/CASE interimValue2 = 0 THEN 1 ELSE interimValue2 END 
FROM 
(
    SELECT 
    SUM(value1)       AS interimValue1 
    SUM(CASE value2 > 0 THEN 1 ELSE 0 END) AS interimValue2, 
    <other fields> 
    FROM 
    <a query> 
) 
    AS step1 


それとも、より多くのあなたが投稿SQLに固有ではなく、一般的なケースへの回答...

SUM(value1)/COALESCE(SUM(CASE WHEN value2 > 0 THEN 1 ELSE NULL END), 1) 

(あなたは0を返す返すNULLは、COALESCEは1秒でNULLを置き換えることができます。)

+1

最初はあなたの答えに十分な注意を払っていませんでした。 0の代わりにNULLを返すことについての最後の提案は、実際には素晴らしいアイデアです!あなたが私の解決策に含める必要がある 'NULLIF'コールをスペアします。 –

1
SUM(Value1)/COALESCE(NULLIF(SUM(CASE WHEN Value2 > 0 THEN 1 ELSE 0 END), 0), 1) 

NULLIFSUMの結果は0に等しい場合NULLが得られます、それ以外の場合は結果を返します。 SUMCOALESCENULLでなければNULLIFの結果を変更せずにそのまま返します。そうでない場合は1が返されます。