【问题标题】:MySQL - Group by rangeMySQL - 按范围分组
【发布时间】:2013-06-12 08:40:51
【问题描述】:

我需要统计数值范围内的记录。

例如:对于集合1, 7, 9, 23, 33, 35, 1017

select count(myvalue) group by round(myvalue / 10) 给出类似:

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

这很好用。但是,我需要设置一个上限,以便 MySQL 返回 40+ --> 1 ? 如何实现?

【问题讨论】:

    标签: mysql count group-by


    【解决方案1】:
    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
    

    【讨论】:

    • 它没有任何想法?选择 t.salary 作为范围,计数(*)作为 num_employee FROM(选择薪水,当薪水 50000 并且薪水
    【解决方案2】:
    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
    

    【讨论】:

    • 如果您可以编辑您的答案并将其放在 MySQL 的上下文中,这将对 OP 有所帮助。
    【解决方案3】:

    您可以对客户端的值求和,也可以使用两个查询(可能使用union)来获取数据,例如:

    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
    

    绝对可以将它写在带有子查询或复杂条件的单个查询中,但它不会那么简单和可维护。

    【讨论】:

    • 我只是希望这是一种为以通用方式进行查询定义上限和下限(例如 20- / 40+)的方法。
    【解决方案4】:

    我建议这个解决方案借鉴了 pilsetnieks 和 Jayram 的解决方案:

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

    【讨论】:

    猜你喜欢
    • 2010-10-31
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多