Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment utiliser MySQL Rollup

Parfois, vous devrez peut-être calculer des totaux et des sous-totaux dans MySQL, ou ajouter des lignes de totaux à vos données. Il peut être fastidieux d'agréger des données à l'aide de l'instruction UNION, en particulier pour calculer des sous-totaux. MySQL Rollup convient à de tels cas d'utilisation. Voici comment utiliser MySQL Rollup pour calculer le total et le sous-total dans MySQL.

Comment utiliser MySQL Rollup

Voici les étapes pour calculer le total et le sous-total à l'aide de MySQL Rollup.

MySQL Rollup vous permet de regrouper facilement des données et de calculer des sous-totaux à l'aide d'une seule instruction. Vous pouvez également l'utiliser pour ajouter des lignes de totaux et des lignes de sous-totaux à vos données, au lieu de les calculer séparément et de combiner le résultat à l'aide de l'instruction UNION.

Voici la syntaxe de MySQL ROLLUP.

SELECT 
    column1, column2, column3, ...
FROM 
    table_name
GROUP BY
    column1, column2,... WITH ROLLUP;

La requête ci-dessus est très similaire à l'agrégation de données à l'aide de l'instruction GROUP BY, sauf que vous ajoutez le mot-clé WITH ROLLUP après la clause GROUP BY.

Dans la requête ci-dessus, nous spécifions les colonnes que nous devons afficher dans notre résultat de requête dans la clause SELECT. Nous devons également mentionner le nom de la table. Dans la clause GROUP BY, nous spécifions les colonnes sur lesquelles nous voulons agréger les données.

Lecture bonus :Comment vérifier la version de MySQL

Supposons que vous ayez la table suivante sales(order_date, sale).

mysql> create table sales(order_date date,sale int);
 
mysql> insert into sales values('2020-01-01',20),
('2020-01-02',25),('2020-01-03',15),('2020-01-04',30),
('2020-02-05',20),('2020-02-10',20),('2020-02-06',25),
('2020-03-07',15),('2020-03-08',30),('2020-03-09',20);
 
mysql> select * from sales;
+------------+------+
| order_date | sale |
+------------+------+
| 2020-01-01 |   20 |
| 2020-01-02 |   25 |
| 2020-01-03 |   15 |
| 2020-01-04 |   30 |
| 2020-02-05 |   20 |
| 2020-02-10 |   20 |
| 2020-02-06 |   25 |
| 2020-03-07 |   15 |
| 2020-03-08 |   30 |
| 2020-03-09 |   20 |
+------------+------+

Lecture bonus :Comment désactiver la vérification de clé étrangère dans MySQL

Voici la requête SQL pour MySQL Rollup pour calculer les valeurs totales et ajouter une ligne totale à la table. Le total général est toujours ajouté en tant que dernière ligne, la colonne GROUP BY étant affectée de la valeur NULL.

mysql> select * from sales 
       group by order_date with rollup;
+------------+------+
| order_date | sale |
+------------+------+
| 2020-01-01 |   20 |
| 2020-01-02 |   25 |
| 2020-01-03 |   15 |
| 2020-01-04 |   30 |
| 2020-02-05 |   20 |
| 2020-02-06 |   25 |
| 2020-02-10 |   20 |
| 2020-03-07 |   15 |
| 2020-03-08 |   30 |
| 2020-03-09 |   20 |
| NULL       |   20 |
+------------+------+

Dans la requête ci-dessus, nous ROLLUP par order_date colonne.

Lecture bonus :comment créer une séquence dans MySQL

Si vous spécifiez plus d'une colonne dans la clause GROUP BY, MySQL assumera une hiérarchie entre elles et cumulera les données en conséquence.

Par exemple, si vous mentionnez

GROUP BY c1, c2, c3 WITH ROLLUP

alors MySQL assumera

c1 > c2 > c3

Il est donc important de faire attention à l'ordre des colonnes dans la clause GROUP BY, lors de l'utilisation de MySQL Rollup. Disons que vous avez le tableau suivant.

mysql> create table sales(product varchar(255),order_date date,sale int);

mysql> insert into sales values('A','2020-01-01',20),('B','2020-01-02',25),
('B','2020-01-03',15),('A','2020-01-04',30),('A','2020-01-05',20);

mysql> select * from sales;
+---------+------------+------+
| product | order_date | sale |
+---------+------------+------+
| A       | 2020-01-01 |   20 |
| B       | 2020-01-02 |   25 |
| B       | 2020-01-03 |   15 |
| A       | 2020-01-04 |   30 |
| A       | 2020-01-05 |   20 |
+---------+------------+------+

Lecture bonus :Comment comparer deux tables dans MySQL

Voici la requête SQL pour cumuler les données par produit et colonnes order_date. Dans ce cas, MySQL calculera non seulement le total général et l'affichera à la fin, mais calculera également les sous-totaux par colonne pour chaque colonne mentionnée dans la clause GROUP BY sauf la dernière, c'est-à-dire uniquement product colonne.

mysql> select product,order_date,sum(sale) 
       from sales group by product,order_date with rollup;
+---------+------------+-----------+
| product | order_date | sum(sale) |
+---------+------------+-----------+
| A       | 2020-01-01 |        20 |
| A       | 2020-01-04 |        30 |
| A       | 2020-01-05 |        20 |
| A       | NULL       |        70 |
| B       | 2020-01-02 |        25 |
| B       | 2020-01-03 |        15 |
| B       | NULL       |        40 |
| NULL    | NULL       |       110 |
+---------+------------+-----------+

Dans le résultat ci-dessus, vous verrez les totaux par produit et le total général mis en évidence en gras

Voici le résultat si vous mentionnez order_date puis la colonne product dans la clause GROUP BY. Dans ce cas, MySQL calculera le total et le total général par date de commande.

mysql> select product,order_date,sum(sale) 
       from sales group by order_date,product with rollup;	   

+---------+------------+-----------+
| product | order_date | sum(sale) |
+---------+------------+-----------+
| A       | 2020-01-01 |        20 |
| NULL    | 2020-01-01 |        20 |
| B       | 2020-01-02 |        25 |
| NULL    | 2020-01-02 |        25 |
| B       | 2020-01-03 |        15 |
| NULL    | 2020-01-03 |        15 |
| A       | 2020-01-04 |        30 |
| NULL    | 2020-01-04 |        30 |
| A       | 2020-01-05 |        20 |
| NULL    | 2020-01-05 |        20 |
| NULL    | NULL       |       110 |
+---------+------------+-----------+

Comme vous pouvez le constater, les résultats sont différents si vous modifiez l'ordre des colonnes mentionné dans la clause GROUP BY. Néanmoins, MySQL ROLLUP est un moyen très pratique de calculer rapidement des sous-totaux et d'ajouter une ligne totale dans MySQL.

Ubiq facilite la visualisation des données en quelques minutes et la surveillance dans des tableaux de bord en temps réel. Essayez-le aujourd'hui !