2012-07-09 147 views
1

如果找不到記錄,是否有方法可以修改此查詢以在成績列中返回'0'?現在,當沒有發現任何東西時,我得到一個空白行。未找到結果時返回'0'

SELECT COALESCE(Score, 0) AS Score, COALESCE(Grade,0) AS Grade, LAST_UPDATE, '' as dummy 
FROM (
SELECT (CASE ScanName WHEN '%=APP%' THEN '= Network System' END) AS System, 
(sum(CASE severity WHEN 1 THEN 10 WHEN 2 THEN 9 WHEN 3 THEN 6 WHEN 4 THEN 3  
END)/COUNT(severity)) AS Score, 
(sum(CASE severity WHEN 1 THEN 10 WHEN 2 THEN 9 WHEN 3 THEN 6 WHEN 4 THEN 3 
END)/COUNT(severity)) AS Grade, LAST_UPDATE 

FROM missing_internal 

WHERE ScanName like '%APP%' 

and LAST_UPDATE >= SUBDATE((SELECT MAX(LAST_UPDATE) from missing_internal), INTERVAL 1 day) 
HAVING System IS NOT NULL 
LIMIT 1 

UNION ALL 

SELECT NULL AS Score, NULL AS Grade, 0 AS LAST_UPDATE, '' as dummy 

ORDER BY LAST_UPDATE DESC 

) as T2 
LIMIT 1; 

分數和分數的目的是相同的,因爲我使用單獨的腳本來將分數應用於分數。

+0

爲sum = 0添加一個case? – 2012-07-09 21:30:02

+1

你的意思是你得到了一個系統的行,但在等級沒有價值?或者你的意思是你根本沒有排? – Randy 2012-07-09 21:30:31

回答

1

看看在COALESCE功能...

如果我很清楚你的問題下面的查詢應該按照你想要的來做(當現在行被返回時變零):

SELECT COALESCE(Score, 0) AS Score, COALESCE(Grade,0) AS Grade, LAST_UPDATE 
FROM (
SELECT (CASE ScanName WHEN 'APP' THEN 'Network System' END) AS System, 
(sum(CASE severity WHEN 1 THEN 10 WHEN 2 THEN 9 WHEN 3 THEN 6 WHEN 4 THEN 3  
END)/COUNT(severity)) AS Score, 
(sum(CASE severity WHEN 1 THEN 10 WHEN 2 THEN 9 WHEN 3 THEN 6 WHEN 4 THEN 3 
END)/COUNT(severity)) AS Grade, LAST_UPDATE 

FROM missing_internal 

WHERE ScanName like '%APP%' 

and LAST_UPDATE >= SUBDATE((SELECT MAX(LAST_UPDATE) from missing_internal), INTERVAL 1 day) 
HAVING System IS NOT NULL 
LIMIT 1 

UNION ALL 

SELECT NULL AS Score, NULL AS Grade, 0 AS LAST_UPDATE 

ORDER BY LAST_UPDATE DESC 
) AS T2 
LIMIT 1; 

我沒有測試過的查詢,所以你可以需要安排它......但是走的想法...

如果你想獲得零隻有當列返回null因此,你可以使用COALESCE,方法與上例相同:

COALESCE(sum(CASE severity WHEN 1 THEN 10 WHEN 2 THEN 9 WHEN 3 THEN 6 WHEN 4 THEN 3 
END)/COUNT(severity), 0) AS Grade 
+0

謝謝,這是我正在尋找,但我得到這個錯誤「UNION和ORDER BY的不正確使用」 – Ben 2012-07-09 22:22:31

+0

好吧,是的順序應該放在最後,對不起我的錯誤,看看更新的答案和再試一次.... – aleroot 2012-07-10 05:30:16

+0

感謝您的更新。我做了改變,現在我得到'每個派生表必須有自己的別名' – Ben 2012-07-10 12:28:52

0

添加ELSECASE

(sum(CASE severity 
    WHEN 1 THEN 10 
    WHEN 2 THEN 9 
    WHEN 3 THEN 6 
    WHEN 4 THEN 3 
    ELSE 0 
END)/COUNT(severity)) AS Grade 

或使用IFNULL()

IFNULL((sum(CASE severity 
     WHEN 1 THEN 10 
     WHEN 2 THEN 9 
     WHEN 3 THEN 6 
     WHEN 4 THEN 3 
     ELSE 0 
    END)/COUNT(severity)), 0) AS Grade