spróbuj tego:
SELECT count(*) as ct,
CASE
WHEN COUNT(*) < 25 THEN '1-25'
WHEN COUNT(*) >= 25 < 50 THEN '25-50'
WHEN COUNT(*) >= 50 < 100 THEN '50-100'
WHEN COUNT(*) >= 100 < 250 THEN '100-250'
WHEN COUNT(*) >= 250 < 500 THEN '250-500'
WHEN COUNT(*) >= 500 < 1000 THEN '500-1000'
ELSE '1000+'
END AS grp
FROM records r, accounts a
WHERE r.account_id=a.id
GROUP BY r.account_id, a.id,
CASE
WHEN COUNT(*) < 25 THEN '1-25'
WHEN COUNT(*) >= 25 < 50 THEN '25-50'
WHEN COUNT(*) >= 50 < 100 THEN '50-100'
WHEN COUNT(*) >= 100 < 250 THEN '100-250'
WHEN COUNT(*) >= 250 < 500 THEN '250-500'
WHEN COUNT(*) >= 500 < 1000 THEN '500-1000'
ELSE '1000+' END
ORDER BY count(*)
Musisz "zdefiniować" "zasobniki", w które chcesz zagregować oryginalne wiersze danych... Do tego służy klauzula Grupuj według... Określa ona kryteria, według których każdy wiersz w tabelach podstawowych będzie analizowany określ, do którego „zasobnika” będą agregowane dane... Wyrażenie lub wyrażenia zdefiniowane w klauzuli group by są „definicjami” tych zasobników.
Gdy zapytanie przetwarza oryginalne wiersze danych, każdy wiersz, dla którego wartości tego wyrażenia są takie same jak w istniejącym zasobniku, jest agregowany do tego zasobnika... Każdy nowy wiersz z wartością niereprezentowaną przez istniejący zasobnik powoduje utworzenie nowego zasobnika...