I think this is what you are after:
SELECT count( sum_price < 10.5 OR NULL) AS "DA $0 - $10"
, count(sum_price >= 10.5 AND sum_price < 20.5 OR NULL) AS "DA $11 - $20"
, count(sum_price >= 20.5 AND sum_price < 30.5 OR NULL) AS "DA $21 - $30"
FROM (
SELECT sum(d."SettlementPointPrice") AS sum_price
FROM public.da d
JOIN public.rt_aggregate r USING ("DeliveryDate", "SettlementPointName")
WHERE d."SettlementPointName" = 'John'
AND d."DeliveryDate" >= '2015-02-01'
AND d."DeliveryDate" <= '2015-02-20'
AND r."DeliveryHour" = 14
AND date_part('hour', d."DeliveryHour") = r."DeliveryHour"
GROUP BY d."SettlementPointPrice",
d."SettlementPointName"
) sub;
At least that's what your given query implies.
It would make a lot more sense to me without `d."SettlementPointPrice"` in the `GROUP BY` clause, though.