2015-01-24 5 views
0

У меня есть большое количество строк, и я хотел бы знать различные диапазоны данных.Группировка диапазонов в строках в Mysql

С помощью этого кода

select 
    count(CASE WHEN the_amount BETWEEN 2000 AND 3000 THEN 1 END) as '2000 to 3000', 
    count(CASE WHEN the_amount BETWEEN 3001 AND 4000 THEN 1 END) as '3001 to 4000', 
    count(CASE WHEN the_amount BETWEEN 4001 AND 5000 THEN 1 END) as '4001 to 5000', 
    count(CASE WHEN the_amount BETWEEN 5001 AND 6000 THEN 1 END) as '5001 to 6000' 
from r_data where transaction_type = 'send' 

я могу рассчитывать диапазоны, но это производит только один ряд.

enter image description here

Что я хотел бы это данные в этом формате

+------+------+----------+ 
| From | To | count(*) | 
+------+------+----------+ 
| 2000 | 3000 | 3 | 
| 3001 | 4000 | 4 | 
| 4001 | 5000 | 2 | 
| 5001 | 6000 | 1 | 
+------+------+----------+ 

Я пытаюсь написать код, как этот

SELECT 
    2000 as 'from', 
    3000 as 'to', 
    COUNT(*) as 'occurence' 
FROM r_data where transaction_type = 'send' 
GROUP BY the_amount; 

но это только шоу для 2000 и 3000 и не событие дает правильный счет. Как я могу написать запрос для получения формата, который я хочу ?.

ответ

1

Если вы не знаете, ваши общие val диапазонов, но вы знаете, что вам нужны ведра 1000 размера, вы можете сделать это:

SELECT COUNT(*) `count`, 
     1000*FLOOR(val/1000) `from`, 
     1000*FLOOR(val/1000)+999 `to` 
    FROM r_data 
WHERE transaction_type = 'send' 
GROUP BY FLOOR(val/1000) 

Выражения GROUP BY FLOOR(val/1000) делает трюк объединения ваших значений в куски 1000.

Вы также можете добавить ORDER BY COUNT(*) DESC к этому запросу, чтобы найти самый большой кусок значений и сделать другие такие манипуляции с отображением данных

+0

Спасибо Olie.This также поможет мне заполнить точки графика, где я действительно не знаю общий вал, который, возможно, может перейти на ось y. – user3272483

0

Попробуйте это:

SELECT 
    vals.val AS `From`, 
    vals.val+999 AS `To`, 
    COUNT(*) AS `Count` 
FROM 
    r_data 
    INNER JOIN (
    SELECT 1 AS val 
    , UNION SELECT 1001 
    , UNION SELECT 2001 
    , UNION SELECT 3001 
    , UNION SELECT 4001 
    , UNION SELECT 5001 
    , UNION SELECT 6001 
    -- , .... 
) AS vals 
    ON r_data.the_amount>=vals.val 
    AND r_data.the_amount<(vals.val+1000) 
GROUP BY vals.val 
+0

Is vals.val table.col format? – user3272483