The sample suggests each row can only have one rating. And only 0 or 1 is in use.
Do the sum / count once in a subquery. That's clearer:
SELECT service_uuid
, round((r5*5 + r4*4 + r3*3 + r2*2 + r1) * 1.0
/ (r5 + r4 + r3 + r2 + r1), 2) AS avg_rating
FROM (
SELECT service_uuid
, count(five_rating = 1 OR NULL) AS r5
, count(four_rating = 1 OR NULL) AS r4
, count(three_rating = 1 OR NULL) AS r3
, count(two_rating = 1 OR NULL) AS r2
, count(one_rating = 1 OR NULL) AS r1
FROM tbl
GROUP BY 1
) sub;
See:
In Postgres 9.4 or later, use the faster aggregate FILTER clause:
SELECT service_uuid
, round((r5*5 + r4*4 + r3*3 + r2*2 + r1) * 1.0
/ (r5 + r4 + r3 + r2 + r1), 2) AS avg_rating
FROM (
SELECT service_uuid
, count(*) FILTER (WHERE five_rating = 1) AS r5
, count(*) FILTER (WHERE four_rating = 1) AS r4
, count(*) FILTER (WHERE three_rating = 1) AS r3
, count(*) FILTER (WHERE two_rating = 1) AS r2
, count(*) FILTER (WHERE one_rating = 1) AS r1
FROM tbl
GROUP BY 1
) sub;
Multiplying with 1.0 converts the bigint counts to numeric, so we avoid integer division and can feed the result to round() to get two fractional digits (you choose).
But your table design seems inefficient.
Either use 1 integer column instead of 5, and allow values from 1 - 5.
Or use 5 boolean columns.
Smaller table, simpler query.