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

Cómo agregar una fila total en MySQL

Muchas veces, necesita informar datos en una tabla MySQL, junto con los totales. Hay 2 formas de agregar una fila total en MySQL, usando UNION ALL y ROLLUP. Aquí se explica cómo agregar una fila total en MySQL.

Cómo agregar una fila total en MySQL

Estos son los pasos para agregar una fila total en 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 |
+------------+------+

Veremos 2 formas de agregar una fila total en MySQL:usando UNION ALL y ROLLUP. La función ROLLUP se agregó a MySQL desde probablemente la versión 5.0. Por lo tanto, aquellos que trabajen con versiones anteriores deberán usar UNION ALL.

Uso de UNION ALL

En este enfoque, SUMAMOS los datos y simplemente los agregamos a nuestra tabla original usando la cláusula UNION ALL, como se muestra a continuación

mysql> select * from sales
       UNION ALL
       select 'Total' order_date,sum(sale) 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 |
| Total      |  220 |
+------------+------+

En la consulta anterior, la fila total que se muestra como la última fila se agrega a su tabla original usando UNION ALL. Esto no cambia la tabla original, sino solo el resultado mostrado. Al usar UNION ALL, es necesario mantener las mismas columnas en todas las consultas de selección que se usan en él. Por eso, hemos asignado un texto 'Total' como order_date columna. UNION ALL es una forma anticuada de sumar el total en MySQL.

Lectura adicional:Cómo calcular el total acumulado en MySQL

Usando ROLLUP

También puede usar GROUP BY con la cláusula ROLLUP para totalizar valores directamente y agregar filas totales automáticamente en MySQL, como se muestra a continuación

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

Usar ROLLUP es más corto y también lo ayuda a agregar una fila de resumen con totales, pero no le permite agregar texto personalizado como "Total" en su última fila. Otro problema es que acumulará automáticamente los datos para varios niveles, agregará filas de subtotales y filas de totales generales.

Aquí hay un ejemplo para agregar una fila total en MySQL, usando 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 concatenar varias filas en un campo en MySQL

No importa cómo especifique su cláusula GROUP BY, invariablemente terminará con NULL y subtotales, cuando agregue una fila total en MySQL, cuando use ROLLUP.

GROUP BY product and order_date
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 |
+---------+------------+-----------+

GROUP BY only product
mysql> select product,order_date,sum(sale) from sales group by product with rollup;
+---------+------------+-----------+
| product | order_date | sum(sale) |
+---------+------------+-----------+
| A       | 2020-01-01 |        70 |
| B       | 2020-01-02 |        40 |
| NULL    | 2020-01-02 |       110 |
+---------+------------+-----------+

GROUP BY order_date
mysql> select product,order_date,sum(sale) from sales group by order_date with rollup;
+---------+------------+-----------+
| product | order_date | sum(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 |
| A       | NULL       |       110 |
+---------+------------+-----------+

Sin embargo, como se mencionó anteriormente, es una forma muy conveniente de calcular subtotales rápidamente y agregar filas totales en MySQL.

Entonces, si desea personalizar su fila total, vaya con UNION ALL, ya que le brinda más control. Por otro lado, si también desea calcular subtotales, vaya con ROLLUP.

¡Eso es todo! Ahora sabe cómo agregar una fila total en MySQL.

Puede usar una herramienta de informes para trazar estos datos en una tabla y compartirlos con su equipo. Este es un ejemplo de una tabla creada con Ubiq.

Si desea crear gráficos, paneles e informes desde la base de datos MySQL, puede probar Ubiq. Ofrecemos una prueba gratuita de 14 días.