MySQL - ROLLUP: データ集約のマスター

こんにちは、MySQLの熱心な愛好者さんたち!今日は、ROLLUP句を使ったデータ集約の世界に楽しい旅に出かけましょう。あなたの近所の親切なコンピュータの先生として、私はこのトピックをステップバイステップで案内します。プログラミングが初めての人も心配しないでください - 基礎から始めて少しずつ進めます。コーヒー(またはお好みでティー)を一杯取り、一緒に飛び込みましょう!

MySQL - ROLLUP

MySQLのROLLUP句:データ分析の新しいベストフレンド

ROLLUPとは?

大きな家族のピクニックを計画しているとします。すべての食品、その数量、価格のリストがあります。それぞれの食品カテゴリーの総コストを簡単に確認し、すべてのものの合計金額を知りたいと思いませんか?それ exactに ROLLUPがMySQLで行うことです - それは、データの異なるレベルでの集計行を作成するのを助けます。

ROLLUPはGROUP BY句の拡張です。単一のクエリで複数のサブトータルと総合計を生成することを許可します。すごいですね?

基本構文

以下はROLLUPを使用するクエリの基本構造です:

SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
GROUP BY column1, column2, ... WITH ROLLUP;

簡単な例で説明しましょう。picnic_itemsというテーブルがあるとします:

CREATE TABLE picnic_items (
item_name VARCHAR(50),
category VARCHAR(50),
quantity INT,
price DECIMAL(10, 2)
);

INSERT INTO picnic_items VALUES
('Sandwich', 'Food', 20, 5.99),
('Soda', 'Drink', 30, 1.99),
('Chips', 'Snack', 15, 2.50),
('Water', 'Drink', 40, 0.99),
('Cookies', 'Snack', 25, 3.50);

今、ROLLUPを使ってピクニックの支出の集計を取得しましょう:

SELECT category, SUM(quantity * price) AS total_cost
FROM picnic_items
GROUP BY category WITH ROLLUP;

結果はこんな感じになるでしょう:

+----------+------------+
| category | total_cost |
+----------+------------+
| Drink    |     159.60 |
| Food     |     119.80 |
| Snack    |     125.00 |
| NULL     |     404.40 |
+----------+------------+

この結果では、各カテゴリーの総コストが表示され、最後の行(カテゴリー列がNULL)はすべてのカテゴリーの合計金額を示しています。

複数のカラムでのROLLUP:さらに深掘り

基礎を理解したので、さらに一歩進めましょう。ROLLUPは複数のカラムでも効力を発揮し、サブトータルのヒエラルキーを作成します。まるでピクニックアイテムをカテゴリーごと、具体的なアイテムごとに整理し、各レベルでの合計を取得するようなものです。

カテゴリーとアイテム名の両方でグループ化するクエリを修正しましょう:

SELECT category, item_name, SUM(quantity * price) AS total_cost
FROM picnic_items
GROUP BY category, item_name WITH ROLLUP;

このクエリは以下のような結果を生成するでしょう:

+----------+------------+------------+
| category | item_name  | total_cost |
+----------+------------+------------+
| Drink    | Soda       |      59.70 |
| Drink    | Water      |      39.60 |
| Drink    | NULL       |      99.30 |
| Food     | Sandwich   |     119.80 |
| Food     | NULL       |     119.80 |
| Snack    | Chips      |      37.50 |
| Snack    | Cookies    |      87.50 |
| Snack    | NULL       |     125.00 |
| NULL     | NULL       |     344.10 |
+----------+------------+------------+

以下のことが起こります:

  1. 各カテゴリー内の特定のアイテムごとの合計が取得されます。
  2. 各カテゴリーのサブトータル(アイテム名がNULL)が取得されます。
  3. 最後に、すべてのカテゴリーとアイテムの総合計(カテゴリーとアイテム名がNULL)が取得されます。

まるでデータベースクエリ結果の中にミニスプレッドシートがあるようなものです!

クライアントプログラムでのROLLUP:すべてをまとめます

今度はより現実的なシナリオでROLLUPスキルを活かしましょう。小さなスーパーマーケットの在庫管理システムを開発しているとします。部署ごと、製品ごとに売上を表示し、全体の合計を示すレポートを作成したいと思っています。

まず、テーブルを作成し、サンプルデータを插入します:

CREATE TABLE sales (
department VARCHAR(50),
product VARCHAR(50),
quarter INT,
revenue DECIMAL(10, 2)
);

INSERT INTO sales VALUES
('Electronics', 'Laptop', 1, 1200.00),
('Electronics', 'Smartphone', 1, 800.00),
('Electronics', 'Laptop', 2, 1500.00),
('Clothing', 'T-Shirt', 1, 200.00),
('Clothing', 'Jeans', 2, 500.00),
('Grocery', 'Bread', 1, 50.00),
('Grocery', 'Milk', 1, 30.00),
('Grocery', 'Eggs', 2, 40.00);

今、包括的なレポートを作成するためにROLLUPを使用しましょう:

SELECT
IFNULL(department, 'Total') AS department,
IFNULL(product, 'Subtotal') AS product,
IFNULL(quarter, 'All Quarters') AS quarter,
SUM(revenue) AS total_revenue
FROM
sales
GROUP BY
department, product, quarter WITH ROLLUP;

このクエリは以下のような詳細なレポートを生成します。IFNULL関数はNULL値をより意味のあるラベルに置き換えます。

以下はこのクエリが行うことです:

  1. データを部署、製品、四半期ごとにグループ化します。
  2. 各組み合わせの売上高の合計を計算します。
  3. ROLLUPを使用して各レベルでのサブトータルを作成します。
  4. NULL値を説明するラベルに置き換えます。

結果はこんな感じになるでしょう:

+-------------+------------+--------------+---------------+
| department  | product    | quarter      | total_revenue |
+-------------+------------+--------------+---------------+
| Clothing    | Jeans      | 2            |        500.00 |
| Clothing    | Jeans      | All Quarters |        500.00 |
| Clothing    | T-Shirt    | 1            |        200.00 |
| Clothing    | T-Shirt    | All Quarters |        200.00 |
| Clothing    | Subtotal   | All Quarters |        700.00 |
| Electronics | Laptop     | 1            |       1200.00 |
| Electronics | Laptop     | 2            |       1500.00 |
| Electronics | Laptop     | All Quarters |       2700.00 |
| Electronics | Smartphone | 1            |        800.00 |
| Electronics | Smartphone | All Quarters |        800.00 |
| Electronics | Subtotal   | All Quarters |       3500.00 |
| Grocery     | Bread      | 1            |         50.00 |
| Grocery     | Bread      | All Quarters |         50.00 |
| Grocery     | Eggs       | 2            |         40.00 |
| Grocery     | Eggs       | All Quarters |         40.00 |
| Grocery     | Milk       | 1            |         30.00 |
| Grocery     | Milk       | All Quarters |         30.00 |
| Grocery     | Subtotal   | All Quarters |        120.00 |
| Total       | Subtotal   | All Quarters |       4320.00 |
+-------------+------------+--------------+---------------+

この結果は売上データの包括的な視点を提供し、各製品、各部署、そして最後に全体の合計を示しています。

有用なROLLUPメソッド

以下はROLLUPを使用するときに役立つメソッドの表です:

メソッド 説明
WITH ROLLUP GROUP BYと一緒に使用してサブトータルと総合計を生成します
IFNULL() NULL値を指定された値に置き換えます
GROUPING() NULL値がROLLUPによって生成された場合1を返し、それ以外の場合0を返します
COALESCE() リスト内の最初の非NULL値を返します

練習すれば完璧です!自分のテーブルを作成し、ROLLUPクエリを試してみてください。データから価値のある洞察を得るための強力なツールです。

そして、ここでMySQLのROLLUP句を使ったスキルを一歩進めたあなたです!シンプルな集計から複雑なヒエラルキーレポートまで、ROLLUPがあなたをサポートします。探索を続け、コードを書き続け、そしてデータとの楽しさを享受してください!

Credits: Image by storyset