Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como usar o pacote cumulativo do MySQL


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