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 BYとROUND関数、そしてUNIONを組み合わせることで、特定の閾値以上のデータを一つのグループにまとめつつ、それ未満のデータを細かい範囲で分類した集計表を簡単に作成できます。年齢層別のユーザー数や価格帯別の商品数など、さまざまなシーンで応用できるテクニックなので、ぜひ活用してみてください。
-
MySQLストアドプロシージャで条件分岐を正しく実装する方法を解説
MySQLストアドプロシージャにおける条件分岐の基本MySQLのストアドプロシージャ内で条件を設定するには、IF ... THEN ... ELSE ... END IF構文を使用します。基本的な書式は以下のとおりです。if yourCondition then yourStatement1; else yourStatement2; end if; end //この構文を使うことで、条件が真(true)の場合はTHEN以降の処理が実行され、偽(false)の場合はELSE以降の処理が実行されます。 実際の実装例それでは、上記の構文をもとに、具体的なストアドプロシージャを作成し
-
Wordでテキストや画像をグループ化する方法【編集ロックの手順を解説】
Word文書内のテキストや画像を、誰にも勝手に変更されたくないと思ったことはありませんか?Wordには「テキスト範囲のグループ化/グループ解除(Group or Ungroup text range)」という便利な機能が搭載されています。この機能を使うと、選択したテキスト範囲をひとつのグループとしてまとめることができ、グループ化された範囲は、編集可能なコンテンツコントロールが含まれる部分を除いて、内容を編集できないようにロックされます。 Wordでテキストや画像をグループ化する手順 Wordで選択したテキスト範囲をグループ化するには、以下の手順に従ってください。 Wordを起動する 新しいテ