Ben
Ben

Reputation: 163

Return '0' when no results found

Is there a way to modify this query to return '0' in the Grade column if no records are found? Right now when nothing is found I get a blank row.

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;

Score and Grade are the same on purpose as I am using a separate script to apply a letter grade to the score.

Upvotes: 1

Views: 761

Answers (2)

aleroot
aleroot

Reputation: 72616

Take a look at the COALESCE function ...

If i well understood your question the below query should do exactly what you want(getting zeros when now rows are returned) :

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;

I have not tested the query, so you could need to arrange it ... However take the idea ...

If you want to get zero only when a column return null result, you can use COALESCE in the same way as above example :

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

Upvotes: 1

Taryn
Taryn

Reputation: 247620

Add an ELSE to the CASE

(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

or use 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

Upvotes: 0

Related Questions