記Mysql區間分組查詢實現

2021-09-23 20:56:13 字數 1972 閱讀 3442

場景:

一張使用者表(user),有使用者id(id)、餘額(balance)等字段,要求展示 餘額在某個區間內的人數

​ 區間有0-1萬,1-10萬,10-50萬,50-100萬,100萬+,

下面是模擬資料:

使用者id		餘額

1 100

2 200

3 3223

4 100001

5 100025

6 512123

7 565656

8 10000001

統計結果應該如下所示:

餘額		  人數

0-1萬 1

1-10萬 2

10-50萬 1

50-100萬 2

100萬+ 1

第一想法
select 

count(if(balance between 0 and 10000, id , null ) ) as "0-1萬",

count(if(balance between 10001 and 100000, id , null ) ) as "1-10萬",

count(if(balance between 100001 and 500000, id , null ) ) as "10-50萬",

count(if(balance between 500001 and 1000000, id , null ) ) as "50-100萬",

count(if(balance > 1000000, id , null ) ) as "100萬+"

from user ;

這樣可以查出來每個範圍對應的人數,但是不盡人意,而且寫的很麻煩…

select interval(balance,0,10000,100000,500000,1000000) as i ,count(*) 

from user group by i;

select elt(interval(balance,0,10000,100000,500000,1000000),"0-1萬","1-10萬","10-50萬","50-100萬","100萬+") as region ,count(*)

from user group by region;

利用了mysql提供的interval和elt函式實現了效果

interval

interval(n,n1,n2,n3) ,比較列表中的n值,該函式如果nelt

elt(n,str1,str2,str3,…) 如果n=1,則返回str1,如果n=2,則返回str2,依次類推

兩個函式結合,再加上group,實現了這種範圍分組的效果

另一種解決辦法

由於使用的是類似mysql語句查詢的乙個分析資料庫,它不支援elt函式和interval函式(抄mysql沒有抄全…)

實現這種範圍分組的場景,可以通過建立中間表的形式實現。然後通過使用者表去join

lower		upper		region

0 10000 0-1萬

10001 100000 1-10萬

100001 500000 10-50萬

500001 1000000 50-100萬

1000000 2000000000 100萬+

使用者表就可以通過餘額欄位去join這個表

select region,count(*)

from user

left join tmp on user.balance between tmp.lower and tmp.upper

group by region

就可以實現範圍分組的效果

相比之前兩種,感覺這個想法很有趣(同事教的)。

打怪公升級!upup!

mysql區間查詢 MySQL區間分組查詢

假設a表為會員資訊表,需要統計男性會員年齡各階段的出現的人數 create table a id int 11 unsigned not null auto increment,name varchar 255 not null default comment 會員名稱 tinyint 1 unsi...

MySQL區間分組查詢

假設a表為會員資訊表,需要統計男性會員年齡各階段的出現的人數 create table a id int 11 unsigned not null auto increment,name varchar 255 not null default comment 會員名稱 tinyint 1 unsi...

mysql 分區間查詢 MySQL區間分組查詢

假設a表為會員資訊表,需要統計男性會員年齡各階段的出現的人數 create table a id int 11 unsigned not null auto increment,name varchar 255 not null default comment 會員名稱 tinyint 1 unsi...