これを試してください:
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(*)
元のデータ行を集約する「バケット」を「定義」する必要があります...これがGroupBy句の目的です...これは、ベーステーブルの各行を分析する基準を定義します。データが集約される「バケット」を決定します...groupby句で定義された1つまたは複数の式は、それらのバケットの「定義」です。
クエリが元のデータ行を処理すると、この式の値が既存のバケットと同じであるすべての行がそのバケットに集約されます...既存のバケットで表されていない値を持つ新しい行バケットにより、新しいバケットが作成されます...