MySQL - группировка по диапазону

Мне нужно посчитать записи в диапазонах значений.

Например: для набора 1, 7, 9, 23, 33, 35, 1017

select count(myvalue) group by round(myvalue / 10) дает что-то вроде:

0-10  -> 3
10-20 -> 0
20-30 -> 1
30-40 -> 2
1010-1020 -> 1

Это отлично работает. Однако мне нужно установить верхний предел, чтобы MySQL возвращал 40+ --> 1? Как этого достичь?

4 ответа

Решение

Вы можете либо суммировать значения на стороне клиента, либо использовать два запроса, возможно с union, чтобы получить данные, например:

select round(myvalue / 10), count(myvalue) from table where myvalue < 40 group by round(myvalue / 10)
union
select '40+', count(myvalue) from table where myvalue >= 40

Абсолютно возможно написать это в одном запросе с подзапросами или запутанными условиями, но это просто не было бы так просто и обслуживаемо.

SELECT case 
   when myvalue >= 0 and myvalue< 10 then '0-9'
   when myvalue >= 10 and myvalue< 20 then '10-19'
   when myvalue >= 20 and myvalue< 20 then '20-29'
   when myvalue >= 30 and myvalue< 40 then '30-39'
   else '40+' 
   end as range
 from t 
group by range
select t.myvalue as [range], count(*) as [occurences]
from (
  select myvalue,
   case when myvalue >= 0 and myvalue< 10 then '0-9'
   when myvalue >= 10 and myvalue< 20 then '10-19'
   when myvalue >= 20 and myvalue< 20 then '20-29'
   when myvalue >= 30 and myvalue< 40 then '30-39'
   else '40+' end as range
 from t) t
group by t.myvalue

Я бы предложил это решение, которое заимствовано из решений Pilsetnieks и Jayram:

SELECT
    COUNT(*) AS cnt,
    IF (myvalue >= 40; -1; ROUND(myvalue / 10) AS range
FROM t
GROUP BY range
Другие вопросы по тегам