Вы можете использовать что-то вроде этого:
SELECT
SUM(CASE (width > height) WHEN true THEN 1 ELSE 0 END)::float8*100/COUNT(*) as aratio,
SUM(CASE (width < height) WHEN true THEN 1 ELSE 0 END)::float8*100/COUNT(*) as bratio,
SUM(CASE (width = height) WHEN true THEN 1 ELSE 0 END)::float8*100/COUNT(*) as cratio,
SUM(CASE (width > height) WHEN true THEN 1 ELSE 0 END),
SUM(CASE (width < height) WHEN true THEN 1 ELSE 0 END),
SUM(CASE (width = height) WHEN true THEN 1 ELSE 0 END),
COUNT(*)
FROM
images WHERE category_id = 4;
этот запрос не группируется по cid, но, вероятно, он вам не нужен.