Às vezes, você pode precisar calcular totais e subtotais no MySQL ou adicionar linhas totais aos seus dados. Pode ser tedioso agregar dados usando a instrução UNION, especialmente para calcular subtotais. O MySQL Rollup é adequado para esses casos de uso. Veja como usar o MySQL Rollup para calcular o total e o subtotal no MySQL.
Como usar o MySQL Rollup
Aqui estão as etapas para calcular o total e o subtotal usando o MySQL Rollup.
O MySQL Rollup permite que você acumule dados facilmente e calcule subtotais usando uma única instrução. Você também pode usá-lo para adicionar linhas totais e linhas de subtotais aos seus dados, em vez de calculá-los separadamente e combinar o resultado usando a instrução UNION.
Aqui está a sintaxe do MySQL ROLLUP.
SELECT
column1, column2, column3, ...
FROM
table_name
GROUP BY
column1, column2,... WITH ROLLUP;
A consulta acima é muito semelhante à agregação de dados usando a instrução GROUP BY, exceto que você adiciona a palavra-chave WITH ROLLUP após a cláusula GROUP BY.
Na consulta acima, especificamos as colunas que precisamos exibir no resultado da consulta na cláusula SELECT. Também precisamos mencionar o nome da tabela. Na cláusula GROUP BY, especificamos as colunas com base nas quais queremos agregar dados.
Bônus de leitura:Como verificar a versão do MySQL
Digamos que você tenha a seguinte tabela 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 |
+------------+------+
Bônus de leitura:Como desativar a verificação de chave estrangeira no MySQL
Aqui está a consulta SQL para o MySQL Rollup para calcular os valores totais e adicionar uma linha total à tabela. O total geral é sempre adicionado como a última linha, com a coluna GROUP BY sendo atribuída ao 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 |
+------------+------+
Na consulta acima, fazemos ROLLUP por order_date coluna.
Bônus de leitura:Como criar sequência no MySQL
Se você especificar mais de uma coluna na cláusula GROUP BY, o MySQL assumirá uma hierarquia entre elas e fará o rollup de dados de acordo.
Por exemplo, se você mencionar
GROUP BY c1, c2, c3 WITH ROLLUP
então o MySQL assumirá
c1 > c2 > c3
Portanto, é importante ter cuidado com a ordem das colunas na cláusula GROUP BY, ao usar o MySQL Rollup. Digamos que você tenha a seguinte tabela.
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 |
+---------+------------+------+
Bônus de leitura:Como comparar duas tabelas no MySQL
Aqui está a consulta SQL para acumular dados por colunas product e order_date. Nesse caso, o MySQL não apenas calculará o total geral e exibirá no final, mas também calculará os subtotais de coluna para cada coluna mencionada na cláusula GROUP BY, exceto a última, ou seja, apenas produto coluna.
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 |
+---------+------------+-----------+
No resultado acima, você verá os totais por produto e o total geral destacados como negrito
Aqui está o resultado se você mencionar order_date e depois a coluna do produto na cláusula GROUP BY. Neste caso, o MySQL calculará o total de ordem_data e o total geral.
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 você pode ver, os resultados são diferentes se você alterar a ordem das colunas mencionadas na cláusula GROUP BY. No entanto, MySQL ROLLUP é uma maneira muito conveniente de calcular subtotais rapidamente e adicionar linha total no MySQL.
O Ubiq facilita a visualização de dados em minutos e o monitoramento em painéis em tempo real. Experimente hoje!