Mysql 将数据拆分为范围并显示计数

Mysql 将数据拆分为范围并显示计数,mysql,Mysql,我不是MySql的专家。我正在尝试根据帐户号将表中的数据拆分为多个范围。这是我的表 mysql> select * from manager; +----+-------+------------+ | id | name | account_no | +----+-------+------------+ | 1 | John | 5 | | 2 | Peter | 15 | | 3 | Tony | 18 | | 4 |

我不是MySql的专家。我正在尝试根据帐户号将表中的数据拆分为多个范围。这是我的表

mysql> select * from manager;
+----+-------+------------+
| id | name  | account_no |
+----+-------+------------+
|  1 | John  |          5 |
|  2 | Peter |         15 |
|  3 | Tony  |         18 |
|  4 | Mac   |         35 |
|  5 | Max   |         55 |
|  6 | Smith |         58 |
+----+-------+------------+
如你所见,账号是一个正数。我想根据账号将这些记录分成10个批次,并显示该范围内的计数。 例如 在0和10之间,只有一条记录 11到20之间有2条记录 21到30之间没有记录*,因此应省略此项* 等 实际上我希望得到这样的输出


我尝试了几种组合,但所有组合的结果都只有一行。有人能帮我吗?

试试这样的东西:

SELECT
    CASE
        WHEN range_start < 10 THEN 'Under 10'
        WHEN range_start BETWEEN 11 and 29 THEN '11 - 29'
        (...more ranges...)
    END as range,
    COUNT(*) AS count
    GROUP BY range
    ORDER BY range

试试这样的方法:

SELECT
    CASE
        WHEN range_start < 10 THEN 'Under 10'
        WHEN range_start BETWEEN 11 and 29 THEN '11 - 29'
        (...more ranges...)
    END as range,
    COUNT(*) AS count
    GROUP BY range
    ORDER BY range

我的建议是创建一个包含范围的表-startRange和endRange:

一旦创建了表,您就可以轻松地加入表以获得计数

select r.startRange,
  r.endRange,
  count(m.account_no) totalCount
from manager m
inner join range_values r
  on m.account_no >=startrange
  and m.account_no <= endrange
group by r.startRange, r.endRange
如果不想创建新表,则可以使用类似于以下内容的方法:

select startrange,
  endrange,
  count(m.account_no) TotalCount
from manager m
inner join
(
  select 1 startRange, 10 endrange union all
  select 11 startRange, 20 endrange union all
  select 21 startRange, 30 endrange union all
  select 31 startRange, 40 endrange union all
  select 41 startRange, 50 endrange union all
  select 51 startRange, 60 endrange
) r
  on m.account_no >=startrange
  and m.account_no <= endrange
group by r.startRange, r.endRange

请参见

我的建议是创建一个包含范围的表-startRange和endRange:

一旦创建了表,您就可以轻松地加入表以获得计数

select r.startRange,
  r.endRange,
  count(m.account_no) totalCount
from manager m
inner join range_values r
  on m.account_no >=startrange
  and m.account_no <= endrange
group by r.startRange, r.endRange
如果不想创建新表,则可以使用类似于以下内容的方法:

select startrange,
  endrange,
  count(m.account_no) TotalCount
from manager m
inner join
(
  select 1 startRange, 10 endrange union all
  select 11 startRange, 20 endrange union all
  select 21 startRange, 30 endrange union all
  select 31 startRange, 40 endrange union all
  select 41 startRange, 50 endrange union all
  select 51 startRange, 60 endrange
) r
  on m.account_no >=startrange
  and m.account_no <= endrange
group by r.startRange, r.endRange

请参见

这将为您提供所需的输出,并在计数列中包含带零的范围

SET @rs = 0; SELECT IF(@rs, @rs := @rs + 10, @rs := 1) AS range_start, @rs + 9 AS range_end, (SELECT COUNT(id) FROM manager WHERE account_no >= @rs AND account_no <= @rs + 9) AS `count` FROM manager;
忽略计数列中带零的行

SET @rs = 0; SELECT * FROM (SELECT IF(@rs, @rs := @rs + 10, @rs := 1) AS range_start, @rs + 9 AS range_end, (SELECT COUNT(id) FROM manager WHERE account_no >= @rs AND account_no <= @rs + 9) AS `count` FROM manager) AS data WHERE `count` > 0;

这将为您提供所需的输出,并在count列中包含带零的范围

SET @rs = 0; SELECT IF(@rs, @rs := @rs + 10, @rs := 1) AS range_start, @rs + 9 AS range_end, (SELECT COUNT(id) FROM manager WHERE account_no >= @rs AND account_no <= @rs + 9) AS `count` FROM manager;
忽略计数列中带零的行

SET @rs = 0; SELECT * FROM (SELECT IF(@rs, @rs := @rs + 10, @rs := 1) AS range_start, @rs + 9 AS range_end, (SELECT COUNT(id) FROM manager WHERE account_no >= @rs AND account_no <= @rs + 9) AS `count` FROM manager) AS data WHERE `count` > 0;

您应该在MSSQL中使用类似于rank和dense_rank的函数,您可以从以下链接开始在MySQL中实现它们:


您应该在MSSQL中使用类似于rank和dense_rank的函数,您可以从以下链接开始在MySQL中实现它们:


这是一个很好的观点。谢谢,但我喜欢不创建另一个表的解决方案。@prageeth请参阅我的编辑,我添加了一个版本,该版本在union all子查询中创建可以加入的范围。你仍然会得到同样的结果——一个很好的分数。谢谢,但我喜欢不创建另一个表的解决方案。@prageeth请参阅我的编辑,我添加了一个版本,该版本在union all子查询中创建可以加入的范围。你仍然会得到同样的结果,效果很好。谢谢但是,它仍然显示不包含匹配行性别的范围:21-30。我将尝试修改您的查询,使其不显示不包含行的范围。有没有办法消除这些空白区域?效果很好。谢谢但是,它仍然显示不包含匹配行性别的范围:21-30。我将尝试修改您的查询,使其不显示不包含行的范围。有没有办法删除这些空范围?