sql >> Base de Datos >  >> RDS >> Mysql

Cómo usar el paquete acumulativo de MySQL

A veces, es posible que necesite calcular totales y subtotales en MySQL, o agregar filas totales a sus datos. Puede ser tedioso agregar datos utilizando la instrucción UNION, especialmente para calcular subtotales. MySQL Rollup es adecuado para tales casos de uso. Aquí se explica cómo usar MySQL Rollup para calcular el total y el subtotal en MySQL.

Cómo usar el resumen de MySQL

Estos son los pasos para calcular el total y el subtotal utilizando MySQL Rollup.

MySQL Rollup le permite acumular datos fácilmente y calcular subtotales usando una sola declaración. También puede usarlo para agregar filas de totales y filas de subtotales a sus datos, en lugar de calcularlos por separado y combinar el resultado usando la instrucción UNION.

Esta es la sintaxis de MySQL ROLLUP.

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

La consulta anterior es muy similar a la agregación de datos mediante la declaración GROUP BY, excepto que agrega la palabra clave WITH ROLLUP después de la cláusula GROUP BY.

En la consulta anterior, especificamos las columnas que necesitamos mostrar en el resultado de nuestra consulta en la cláusula SELECT. También necesitamos mencionar el nombre de la tabla. En la cláusula GROUP BY, especificamos las columnas en función de las cuales queremos agregar datos.

Lectura adicional:Cómo comprobar la versión de MySQL

Supongamos que tiene la siguiente tabla 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 |
+------------+------+

Lectura adicional:Cómo deshabilitar la verificación de clave externa en MySQL

Aquí está la consulta SQL para MySQL Rollup para calcular los valores totales y agregar una fila total a la tabla. El total general siempre se agrega como la última fila, y a la columna GROUP BY se le asigna un valor 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 |
+------------+------+

En la consulta anterior, ROLLUP por order_date columna.

Lectura adicional:Cómo crear una secuencia en MySQL

Si especifica más de una columna en la cláusula GROUP BY, MySQL asumirá una jerarquía entre ellas y acumulará los datos en consecuencia.

Por ejemplo, si menciona

GROUP BY c1, c2, c3 WITH ROLLUP

entonces MySQL asumirá

c1 > c2 > c3

Por lo tanto, es importante tener cuidado con el orden de las columnas en la cláusula GROUP BY al usar MySQL Rollup. Digamos que tienes la siguiente tabla.

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

Lectura adicional:Cómo comparar dos tablas en MySQL

Aquí está la consulta SQL para acumular datos por producto y columnas order_date. En este caso, MySQL no solo calculará el total general y lo mostrará al final, sino que también calculará los subtotales por columnas para cada columna mencionada en la cláusula GROUP BY excepto la última, es decir, solo producto columna.

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

En el resultado anterior, verá los totales por producto y el total general resaltados en negrita.

Este es el resultado si menciona order_date y luego la columna de producto en la cláusula GROUP BY. En este caso, MySQL calculará el total general y el total ordenado por fecha de pedido.

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

Como puede ver, los resultados son diferentes si cambia el orden de las columnas mencionadas en la cláusula GROUP BY. Sin embargo, MySQL ROLLUP es una forma muy conveniente de calcular subtotales rápidamente y agregar filas totales en MySQL.

Ubiq facilita la visualización de datos en minutos y la supervisión en paneles en tiempo real. ¡Pruébalo hoy!