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

pra*_*eth 0 mysql

我不是 MySql 的专家。我正在尝试将表中的数据拆分为基于account_no. 这是我的桌子。

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 |
+----+-------+------------+
Run Code Online (Sandbox Code Playgroud)

如您所见,这account_no是一个正数。我想根据account_no将这些记录分成 10 个批次并显示该范围内的计数。

举一个例子
之间010只有1记录
之间的11202条记录
之间的2130没有记录* (所以这应该被忽略。) *
等..

其实我希望能得到一个输出像这样。

+-------------+-----------+-------+
| range_start | range_end | count |
+-------------+-----------+-------+
|           1 | 10        |     1 | -> because there is 1 record between 1 and 10
|          11 | 20        |     2 | -> because there are 2 records between 11 and 20
|          31 | 40        |     1 | -> because there is 1 record between 31 and 40
|          51 | 60        |     2 | -> because there are 2 records between 51 and 60
+-------------+-----------+-------+
Run Code Online (Sandbox Code Playgroud)

我尝试了几种组合,但所有组合都只给了我一行结果。
有谁能够帮助我?

Tar*_*ryn 5

我的建议是创建一个包含范围的表 -startRangeendRange

CREATE TABLE range_values   (`startRange` int, `endRange` int) ;

INSERT INTO range_values(`startRange`, `endRange`)
VALUES (1, 10), (11, 20), (21, 30), (31, 40), (51, 60);
Run Code Online (Sandbox Code Playgroud)

创建表后,您可以轻松加入表以获取计数。

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
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

该表的好处是您无需对范围值进行编码,并且无需更改代码即可轻松更新表中的范围。

此查询返回:

| STARTRANGE | ENDRANGE | TOTALCOUNT |
--------------------------------------
|          1 |       10 |          1 |
|         11 |       20 |          2 |
|         31 |       40 |          1 |
|         51 |       60 |          2 |
Run Code Online (Sandbox Code Playgroud)

如果您不想创建新表,则可以使用类似于以下内容的内容:

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
Run Code Online (Sandbox Code Playgroud)

请参阅带有演示的 SQL Fiddle