2013-06-12 20 views
7

Potrzebuję policzyć rekordy w zakresie wartości.MySQL - Grupa według zakresu

Na przykład: dla zestawu 1, 7, 9, 23, 33, 35, 1017

select count(myvalue) group by round(myvalue/10) daje coś takiego:

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

to działa prawidłowo. Jednak muszę ustawić górny limit, tak aby MySQL zwraca 40+ --> 1? Jak można to osiągnąć?

Odpowiedz

12

Można albo suma wartości po stronie klienta lub użyć dwóch zapytań, z możliwością union, aby pobrać dane, np:

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 

To jest absolutnie możliwe, aby zapisać go w jednym zapytanie z podzapytaniami lub zawiłymi warunkami, ale nie byłoby to tak proste i łatwe w utrzymaniu.

+0

Miałem tylko nadzieję, że był to sposób zdefiniowania górnego i dolnego limitu (np. 20-/40+) do wykonania zapytania w sposób ogólny. – thelost

3
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 
+0

Nie pracował jakiś pomysł? SELECT t.salary jako zakres, liczba (*), a num_employee Z (SELECT zarobki, przypadku, gdy płaca <= 50000, a następnie 'Najniższa' PO płaca> 50000 i pobory <= 70000 THEN 'medium' ELSE 'najwyższe' END AS RANGE FROM employee_salary) t GROUP BY t.salary – atjoshi

2

Proponuję to rozwiązanie, które pożycza od obu pilsetnieks i rozwiązań Jayram za:

SELECT 
    COUNT(*) AS cnt, 
    IF (myvalue >= 40; -1; ROUND(myvalue/10) AS range 
FROM t 
GROUP BY range 
+0

Przynajmniej w MySQL, 'range' jest zastrzeżonym słowem: [9.3 Zarezerwowane Słowa] (http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html) – berliner

0
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 
+1

byłoby pomocne dla OP, jeśli mógłbyś edytować swoją odpowiedź i umieścić ją w kontekście MySQL. – minocha