2017-09-27 82 views
0

我正在尋找一種將MYSQL數據分組爲桶(值範圍)的方法,然後計算每個組中有多少個值,然後將其繪製在圖上。MYSQL - 如何根據範圍對數據進行分組並計數

我有很多的範圍,不是像這裏我會手動做的很少。

例如,如果我的數據看起來像:

+--------+ 
| column | 
+--------+ 
|  1 | 
|  2 | 
|  10 | 
|  15 | 
|  20 | 
| 100 | 
| 150 | 
| 1000 | 
| 10000 | 
+--------+ 

我可以創建水桶和計數每個桶中的值的數目:

+-------------+---------------+-----------------+-----------------+ 
| bucket(0-9) | bucket(10-99) | bucket(100-999) | bucket(1000-1M) | 
+-------------+---------------+-----------------+-----------------+ 
|   2 |    3 |    2 |    2 | 
+-------------+---------------+-----------------+-----------------+ 
  • 計數(0-9)=> 2值
  • 計數(10-99)=> 3值
  • 計數(100-999)=> 2值
  • 計數(1000-1M)=> 2倍的值
+0

對於必須使用準備好的語句桶的動態數量。 –

+0

你能指點我一個例子嗎? –

+0

@GiorgosBetsos我看不出這是'動態'。範圍似乎是手動構建的。相反,它*是動態的,我不明白爲什麼會使用準備好的語句 - 雖然我接受這將是一個解決方案。 – Strawberry

回答

2

如果上限小於1M,也許你可以根據你的樣本數據嘗試count(case when ... then .. end)和期望的結果:

select 
    count(case when col between 0 and 9 then 1 end) `bucket(0-9)`, 
    count(case when col between 10 and 99 then 1 end) `bucket(10-99)`, 
    count(case when col between 100 and 999 then 1 end) `bucket(100-999)`, 
    count(case when col between 1000 and 1000000 then 1 end) `bucket(1000-1M)` 
from test 

檢查demo在SQLFiddle中。

+0

太棒了。我會試試看! –

+0

是1M的上限重要 –

+0

如果您有另一個間隔超過1M,則應該添加另一個「count」。 – Blank

0

這裏的另一個想法一起玩......

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table (i INT NOT NULL PRIMARY KEY); 

INSERT INTO my_table VALUES 
(1), 
(2), 
(10), 
(15), 
(20), 
(100), 
(150), 
(1000), 
(10000); 

SELECT LENGTH(i) bucket 
    , CONCAT(RPAD(1,LENGTH(i),0),'-',RPAD(9,LENGTH(i),9)) range 
    , COUNT(*) total 
    FROM my_table 
GROUP 
    BY bucket; 
+--------+-------------+-------+ 
| bucket | range  | total | 
+--------+-------------+-------+ 
|  1 | 1-9   |  2 | 
|  2 | 10-99  |  3 | 
|  3 | 100-999  |  2 | 
|  4 | 1000-9999 |  1 | 
|  5 | 10000-99999 |  1 | 
+--------+-------------+-------+ 
相關問題