我正在使用 MySQL,我需要帮助将 COUNT(*) 用于表中的一系列值。
我有一个名为 PERSON 的表(在实时系统中,我希望有几十万或更多的记录)。
Name Result
a 100
b 130.45
c 182.96
d 65.45
e 199
f 245
Run Code Online (Sandbox Code Playgroud)
我需要查询表以找出属于给定范围的记录数。例如,有多少人属于 0-50 范围。范围值是动态的。所以预期的结果是这样的:
Range Count
0-50 0
51-100 2
101-150 1
151-200 2
201-250 1
Run Code Online (Sandbox Code Playgroud)
当然,我可以这样做:
SELECT COUNT(*) FROM PERSON WHERE RESULT <= 50
SELECT COUNT(*) FROM PERSON WHERE RESULT > 50 AND RESULT <= 100
Run Code Online (Sandbox Code Playgroud)
等等所有范围......
但是,必须有更好、更有效的方法来做到这一点吗?
小智 11
使用case
你可以定义任何你想要的范围。
select
case
when RESULT between 0 and 50 then '0-50'
when RESULT between 50 and 100 then '51-100'
when RESULT between 100 and 150 then '101-150'
when RESULT between 150 and 200 then '151-200'
when RESULT between 200 and 250 then '201-250'
else 'OTHERS'
end as `Range`,
count(1) as `Count`
from PERSON
group by `Range`;
Run Code Online (Sandbox Code Playgroud)
除非我在分组计算中犯了错误(抱歉,我现在无法测试它),否则你可以使用类似的东西
SELECT CONCAT(grp_id*50+IF(grp_id>0,1,0),'-',(grp_id+1)*50) as `Range`, cnt as `Count`
FROM
(
SELECT floor(IF(Result-1<0,0,Result-1)/50) as grp_id, COUNT(*) as cnt
FROM PERSON
GROUP BY floor(IF(Result-1<0,0,Result-1)/50)
)a
Run Code Online (Sandbox Code Playgroud)
并不真正需要派生表,我在这里使用它只是为了清楚起见
归档时间: |
|
查看次数: |
20503 次 |
最近记录: |