À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!