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 |
+----------+------------+------------+
以下のことが起こります:
- 各カテゴリー内の特定のアイテムごとの合計が取得されます。
- 各カテゴリーのサブトータル(アイテム名がNULL)が取得されます。
- 最後に、すべてのカテゴリーとアイテムの総合計(カテゴリーとアイテム名が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値をより意味のあるラベルに置き換えます。
以下はこのクエリが行うことです:
- データを部署、製品、四半期ごとにグループ化します。
- 各組み合わせの売上高の合計を計算します。
- ROLLUPを使用して各レベルでのサブトータルを作成します。
- 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