MySQL - ROLLUP : Maîtriser l'agrégation des données

Bonjour à tous, les passionnés de MySQL ! Aujourd'hui, nous allons entreprendre un voyage passionnant dans le monde de l'agrégation des données avec la clause ROLLUP. En tant que votre enseignant bienveillant en informatique, je suis là pour vous guider à travers ce sujet étape par étape. Ne vous inquiétez pas si vous êtes nouveau dans la programmation - nous allons commencer par les bases et progresser pas à pas. Alors, prenez une tasse de café (ou de thé, si c'est votre truc), et plongons dedans !

MySQL - ROLLUP

La clause ROLLUP de MySQL : votre nouveau meilleur ami dans l'analyse des données

Qu'est-ce que ROLLUP ?

Imaginez que vous préparez un grand pique-nique de réunion de famille. Vous avez une liste de tous les articles alimentaires, leurs quantités et leurs prix. Ne serait-il pas génial de pouvoir voir rapidement le coût total pour chaque catégorie d'aliments, ainsi que le total général pour tout ? C'est exactement ce que fait ROLLUP dans MySQL - il vous aide à créer des lignes de résumé à différents niveaux de vos données.

ROLLUP est une extension de la clause GROUP BY. Il vous permet de générer plusieurs niveaux de sous-totaux et un total général en une seule requête. Pretty neat, non ?

Syntaxe de base

Voici la structure de base d'une requête utilisant ROLLUP :

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

Reprenons cela avec un exemple simple. Imaginez que nous avons une table appelée 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);

Maintenant, utilisons ROLLUP pour obtenir un résumé de nos dépenses de pique-nique :

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

Le résultat pourrait ressembler à ceci :

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

Dans ce résultat, nous voyons le coût total pour chaque catégorie, et la dernière ligne (avec NULL dans la colonne category) nous donne le total général pour toutes les catégories combinées. Ce NULL est la manière de ROLLUP de dire "c'est le total de tout ce qui est au-dessus."

ROLLUP sur plusieurs colonnes : plongeon plus profond

Maintenant que nous avons les bases, mettons-nous au niveau supérieur. ROLLUP peut faire des merveilles sur plusieurs colonnes, créant une hiérarchie de sous-totaux. C'est comme organiser vos articles de pique-nique par catégorie, puis par article spécifique, et obtenir des totaux à chaque niveau.

Modifions notre requête pour regrouper par category et item_name :

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

Cette requête pourrait produire un résultat comme celui-ci :

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

Voici ce qui se passe :

  1. Nous obtenons des totaux pour chaque article spécifique dans chaque catégorie.
  2. Nous obtenons des sous-totaux pour chaque catégorie (là où item_name est NULL).
  3. Nous obtenons un total général à la fin (là où både category et item_name sont NULL).

C'est comme avoir un mini-tableur directement dans les résultats de votre requête de base de données !

Utilisation de ROLLUP dans un programme client : tout rassembler

Maintenant, mettons nos compétences ROLLUP à l'œuvre dans un scénario plus réaliste. Imaginez que vous êtes en train de développer un système simple de gestion des stocks pour une petite épicerie. Vous voulez créer un rapport qui montre les ventes par département, produit, puis donne des totaux globaux.

Créons d'abord notre table et insérons des données d'exemple :

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

Maintenant, créons un rapport complet en utilisant 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;

Cette requête produira un rapport détaillé avec des sous-totaux à chaque niveau. La fonction IFNULL est utilisée pour remplacer les valeurs NULL par des étiquettes plus significatives.

Voici ce que fait cette requête :

  1. Elle regroupe les données par département, produit et trimestre.
  2. Elle calcule la somme du revenu pour chaque combinaison.
  3. Elle utilise ROLLUP pour créer des sous-totaux à chaque niveau.
  4. Elle remplace les valeurs NULL par des étiquettes descriptives pour une meilleure lisibilité.

Le résultat pourrait ressembler à ceci :

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

Ce résultat nous donne une vue complète de nos données de ventes, avec des sous-totaux pour chaque produit, chaque département, et un total général à la fin.

Méthodes utiles avec ROLLUP

Voici un tableau résumant quelques méthodes utiles lors de l'utilisation de ROLLUP :

Méthode Description
WITH ROLLUP Utilisé avec GROUP BY pour générer des sous-totaux et un total général
IFNULL() Remplace les valeurs NULL par une valeur spécifiée
GROUPING() Retourne 1 pour les valeurs NULL produites par ROLLUP, 0 sinon
COALESCE() Retourne la première valeur non-NULL dans une liste

Souvenez-vous, la pratique rend parfait ! Essayez de créer vos propres tables et d'expérimenter avec des requêtes ROLLUP. C'est un outil puissant qui peut fournir des insights précieux sur vos données.

Et voilà, les amis ! Vous avez vient de monter en niveau vos compétences MySQL avec la clause ROLLUP. De simples résumés à des rapports hiérarchiques complexes, ROLLUP vous couvre. Continuez à explorer, continuez à coder, et surtout, continuez à vous amuser avec les données !

Credits: Image by storyset