2012-01-04 75 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 2012-01-04 15:08:00

+0

'WHEN'似乎不見了。 – 2012-01-04 15:25:05

回答

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允許聚結,用ls替換空值NULL)

+1

起初沒有給予足夠的重視。你最後關於返回NULL的建議實際上是一個好主意!爲您提供'NULLIF'調用,這是我必須包含在我的解決方案中的。 – 2012-01-04 18:24:45

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

NULLIF將產生NULL如果SUM結果等於0,否則會返回的結果SUM。如果COALESCE不是NULL,則NULLIF的結果將保持不變,否則將返回1