MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで数値を範囲ごとにグループ化して集計する方法

MySQLで範囲ごとにデータをグループ化するには?

MySQLでは、数値データを「0〜9」「10〜19」のような一定の範囲(レンジ)ごとにまとめて集計したい場面がよくあります。本記事では、サンプルテーブルを作成し、ROUND関数とUNIONを組み合わせることで、範囲ごとのグループ化を実現する具体的な手順を解説します。

ステップ1:サンプルテーブルを作成する

まず、範囲ごとのグループ化を試すためのテーブルを作成します。テーブル作成のクエリは以下の通りです。

mysql> create table GroupByRangeDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> YourRangeValue int
-> );
Query OK, 0 rows affected (0.78 sec)

このテーブルは、自動採番される主キー「Id」と、集計対象となる整数値「YourRangeValue」の2つのカラムを持っています。

ステップ2:テーブルにレコードを挿入する

続いて、INSERTコマンドを使ってテーブルに複数のレコードを挿入します。クエリは以下の通りです。

mysql> insert into GroupByRangeDemo(YourRangeValue) values(1);
Query OK, 1 row affected (0.14 sec)
mysql> insert into GroupByRangeDemo(YourRangeValue) values(7);
Query OK, 1 row affected (0.15 sec)
mysql> insert into GroupByRangeDemo(YourRangeValue) values(9);
Query OK, 1 row affected (0.14 sec)
mysql> insert into GroupByRangeDemo(YourRangeValue) values(23);
Query OK, 1 row affected (0.13 sec)
mysql> insert into GroupByRangeDemo(YourRangeValue) values(33);
Query OK, 1 row affected (0.15 sec)
mysql> insert into GroupByRangeDemo(YourRangeValue) values(35);
Query OK, 1 row affected (0.16 sec)
mysql> insert into GroupByRangeDemo(YourRangeValue) values(1017);
Query OK, 1 row affected (0.11 sec)

ステップ3:テーブル内の全レコードを確認する

SELECT文を使って、テーブル内のすべてのレコードを表示してみましょう。

mysql> select *from GroupByRangeDemo;

実行結果は以下のようになります。

+----+----------------+
| Id | YourRangeValue |
+----+----------------+
|  1 |              1 |
|  2 |              7 |
|  3 |              9 |
|  4 |             23 |
|  5 |             33 |
|  6 |             35 |
|  7 |           1017 |
+----+----------------+
7 rows in set (0.04 sec)

ステップ4:範囲ごとにグループ化するクエリ

それでは本題である、範囲ごとのグループ化クエリを見ていきましょう。

mysql> select round(YourRangeValue / 10), count(YourRangeValue) from GroupByRangeDemo where YourRangeValue < 40 group by round(YourRangeValue / 10)
-> union
-> select '40+', count(YourRangeValue) from GroupByRangeDemo where YourRangeValue >= 40;

実行結果は以下の通りです。

+----------------------------+-----------------------+
| round(YourRangeValue / 10) | count(YourRangeValue) |
+----------------------------+-----------------------+
| 0                           |                       1 |
| 1                           |                       2 |
| 2                           |                       1 |
| 3                           |                       1 |
| 4                           |                       1 |
| 40+                         |                       1 |
+----------------------------+-----------------------+
6 rows in set (0.08 sec)

クエリの仕組みを解説

このクエリのポイントは以下の2点です。

  • ROUND関数による範囲の分割: round(YourRangeValue / 10) によって、値を10で割って四捨五入しています。これにより、1・7・9は「0」(0〜9の範囲)、23は「2」(20〜29の範囲)のように、同じ区切りの値が同じグループにまとまります。
  • UNIONによる40以上の一括集計: 前半のSELECT文では WHERE YourRangeValue < 40 で40未満の値だけを範囲ごとに集計し、後半のSELECT文で YourRangeValue >= 40 の値を「40+」というラベル付きで合計件数として結合しています。

このように、GROUP BYROUND関数、そしてUNIONを組み合わせることで、特定の閾値以上のデータを一つのグループにまとめつつ、それ未満のデータを細かい範囲で分類した集計表を簡単に作成できます。年齢層別のユーザー数や価格帯別の商品数など、さまざまなシーンで応用できるテクニックなので、ぜひ活用してみてください。

  1. MySQLストアドプロシージャで条件分岐を正しく実装する方法を解説

    MySQLストアドプロシージャにおける条件分岐の基本MySQLのストアドプロシージャ内で条件を設定するには、IF ... THEN ... ELSE ... END IF構文を使用します。基本的な書式は以下のとおりです。if yourCondition then yourStatement1; else yourStatement2; end if; end //この構文を使うことで、条件が真(true)の場合はTHEN以降の処理が実行され、偽(false)の場合はELSE以降の処理が実行されます。 実際の実装例それでは、上記の構文をもとに、具体的なストアドプロシージャを作成し

  2. Wordでテキストや画像をグループ化する方法【編集ロックの手順を解説】

    Word文書内のテキストや画像を、誰にも勝手に変更されたくないと思ったことはありませんか?Wordには「テキスト範囲のグループ化/グループ解除(Group or Ungroup text range)」という便利な機能が搭載されています。この機能を使うと、選択したテキスト範囲をひとつのグループとしてまとめることができ、グループ化された範囲は、編集可能なコンテンツコントロールが含まれる部分を除いて、内容を編集できないようにロックされます。 Wordでテキストや画像をグループ化する手順 Wordで選択したテキスト範囲をグループ化するには、以下の手順に従ってください。 Wordを起動する 新しいテ