I have a query like this:
select
case when sp.provider='prv1' and sp.status_code = 404 then 'failed'
when sp.provider='prv1' and sp.status_code = 200 then 'success'
when time_taken is null or sp.status_code in (503) or sp.status_code is null then 'unavailable'
else 'other'
end as result,
count(*)
from services_serviceprofile sp
where
service_type = 'type1' and
sp.provider = 'prv1' and
sp.start_time >= '2022-08-22 00:00'
group by
case when sp.provider='prv1' and sp.status_code = 404 then 'failed'
when sp.provider='prv1' and sp.status_code = 200 then 'success'
when time_taken is null or sp.status_code = 503 or sp.status_code is null then 'unavailable'
else 'other'
end
order by count(*) desc;
How can I add a row for ‘all’ requests in CASES? If we add a when sp.provider='prv1' with no more detailed condition then all cases become one ‘all’ case because and other cases are ignored.
Advertisement
Answer
You can’t do that inside the CASE, as it behaves like a series of IF.
You need to compute the total separately and append it using UNION or delegate the total calculation to whatever tool uses those data.
WITH RequestStats
AS (
SELECT
CASE
WHEN sp.provider = 'prv1' AND sp.status_code = 404 THEN 'failed'
WHEN sp.provider = 'prv1' AND sp.status_code = 200 THEN 'success'
WHEN time_taken IS NULL OR sp.status_code IN (503) OR sp.status_code IS NULL THEN 'unavailable'
ELSE 'other'
END AS Result
,count(*) AS RequestCount
FROM services_serviceprofile sp
WHERE
service_type = 'type1'
AND sp.provider = 'prv1'
AND sp.start_time >= '2022-08-22 00:00'
)
SELECT
Result
,RequestCount
FROM RequestStats
UNION ALL
SELECT
'All' AS Result
,SUM(RequestCount) AS RequestCount
FROM RequestStats
