2013-06-12 40 views
7

Tôi cần đếm các bản ghi trong phạm vi giá trị.MySQL - Nhóm theo dải

Ví dụ: đối với các thiết lập 1, 7, 9, 23, 33, 35, 1017

select count(myvalue) group by round(myvalue/10) cho một cái gì đó như:

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

này hoạt động tốt. Tuy nhiên, tôi cần đặt giới hạn trên, để MySQL trả về 40+ --> 1? Làm cách nào để đạt được điều này?

Trả lời

12

Bạn có thể tổng hợp các giá trị trên các mặt hàng hoặc sử dụng hai truy vấn, có thể với union, để lấy dữ liệu, ví dụ:

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 

Đó là hoàn toàn có thể viết nó trong một đơn truy vấn với các truy vấn phụ hoặc các điều kiện phức tạp nhưng nó sẽ không đơn giản và có thể duy trì được.

+0

Tôi chỉ hy vọng đó là một cách để xác định giới hạn trên và dưới (ví dụ 20-/40+) để thực hiện truy vấn theo cách chung chung. – 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

Nó không làm việc bất kỳ ý tưởng? CHỌN t.salary là phạm vi, số (*) là num_employee TỪ (CHỌN mức lương, TRƯỜNG HỢP KHI B salaryNG TIỀN <= 50000 THEN 'Thấp nhất' KHI lương> 50000 và tiền lương <= 70000 THEN 'Trung bình' ELSE 'Cao nhất' END AS RANGE FROM employee_salary) t GROUP BY t.salary – atjoshi

2

tôi sẽ đề nghị giải pháp này mà vay mượn từ cả pilsetnieks và giải pháp Jayram của:

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

Ít nhất trong MySQL, 'dải ô' là một từ dành riêng: [9.3 Dành riêng cho từ] (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

nó sẽ hữu ích cho OP nếu bạn có thể chỉnh sửa câu trả lời của bạn và đặt nó trong ngữ cảnh để MySQL. – minocha