0

私は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 |
+----+-------+------------+

ご覧のとおり、account_noは正の数です。これらのレコードをaccount_noに基づいて 10 個のバッチに分割し、その範囲内のカウントを表示したいと考えています。 0から10 の間

の例では、 11から20 の間には1 つのレコードしかありません21から30 の間には2 つのレコードがあります レコードはありません* (したがって、これは省略されるべきです) * など...実際、私は出力を得ることを望んでいますこのような。






+-------------+-----------+-------+
| 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
+-------------+-----------+-------+

いくつかの組み合わせを試しましたが、結果はすべて 1 行しか表示されません。
誰でも私を助けることができますか?

4

4 に答える 4

5

私の提案は、範囲を含むテーブルを作成することです-startRangeおよびendRange:

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);

テーブルが作成されると、テーブルに簡単に参加してカウントを取得できます。

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

SQL Fiddle with Demoを参照してください。

テーブルの利点は、範囲の値をコーディングする必要がなく、コードを変更しなくてもテーブル内の範囲を簡単に更新できることです。

このクエリは次を返します。

| STARTRANGE | ENDRANGE | TOTALCOUNT |
--------------------------------------
|          1 |       10 |          1 |
|         11 |       20 |          2 |
|         31 |       40 |          1 |
|         51 |       60 |          2 |

新しいテーブルを作成したくない場合は、次のようなものを使用できます。

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

デモで SQL Fiddle を参照してください

于 2013-03-07T16:35:14.150 に答える
1

これにより、必要な出力が得られ、カウント列にゼロの範囲が含まれます。

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;
于 2013-03-07T16:51:23.547 に答える
0

次のようなものを試してください:

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
于 2013-03-07T16:14:29.380 に答える
0

MSSQL の rank および dense_rank と同様の関数を使用する必要があります。これらの関数は、次のリンクから MySQL に実装できます。

http://www.folkstalk.com/2013/03/grouped-dense-rank-function-mysql-sql-query.html

于 2016-10-09T21:24:26.740 に答える