Как я прокомментировал в вашем предыдущем вопросе по этой теме, есть более хороший способ сделать это, который включает в себя гораздо менее жесткое кодирование значений диапазона, предполагая, что большинство диапазонов распределены равномерно (то есть, порциями по 50, 100 и т. Д.)
+---------+--------+
| user_id | amount |
+---------+--------+
| 1 | 300 |
| 1 | 100 |
| 2 | 100 |
| 2 | 100 |
| 3 | 10 |
| 4 | 200 |
+---------+--------+
6 rows in set (0.00 sec)
select rng, obs
from
(
select 't' as src,
case when amount < 100 then '0-99'
when amount > 150 then '> 150'
else
concat(floor(amount/50) * 50 , '-' ,floor(amount/50) * 50 + 49)
end as rng,
count(*) obs
from t
group by src,rng
) a
union select 'Total' rng, count(*) from t
group by rng;
Здесь вычисления с использованием пола определяют большую часть значений диапазона, простое объединение вычисляет общую сумму.
+---------+-----+
| rng | obs |
+---------+-----+
| 0-99 | 1 |
| 100-149 | 3 |
| > 150 | 2 |
| Total | 6 |
+---------+-----+
4 rows in set (0.01 sec)
Если вам нужно заполнить значения диапазона, которые не существуютв вашей таблице см. https://dba.stackexchange.com/questions/68791/group-by-in-ranges для предлагаемого подхода.