sql >> Database >  >> RDS >> Mysql

MySQL Rollup gebruiken

Soms moet u totalen en subtotalen berekenen in MySQL, of totaalrijen toevoegen aan uw gegevens. Het kan vervelend zijn om gegevens te aggregeren met behulp van de UNION-instructie, vooral om subtotalen te berekenen. MySQL Rollup is geschikt voor dergelijke gebruikssituaties. Hier leest u hoe u MySQL Rollup gebruikt om het totaal en subtotaal in MySQL te berekenen.

MySQL Rollup gebruiken

Hier zijn de stappen om het totaal en het subtotaal te berekenen met MySQL Rollup.

Met MySQL Rollup kunt u eenvoudig gegevens optellen en subtotalen berekenen met één enkele verklaring. U kunt het ook gebruiken om totaalrijen en subtotaalrijen aan uw gegevens toe te voegen, in plaats van ze afzonderlijk te berekenen en het resultaat te combineren met de UNION-instructie.

Dit is de syntaxis van MySQL ROLLUP.

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

De bovenstaande query lijkt erg op het verzamelen van gegevens met behulp van de GROUP BY-instructie, behalve dat u het trefwoord WITH ROLLUP toevoegt na de GROUP BY-clausule.

In de bovenstaande query specificeren we de kolommen die we moeten weergeven in ons queryresultaat in de SELECT-clausule. We moeten ook de tafelnaam vermelden. In de GROUP BY-clausule specificeren we de kolommen op basis waarvan we gegevens willen samenvoegen.

Bonus lezen:MySQL-versie controleren

Stel dat u de volgende tabelverkoop heeft (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 |
+------------+------+

Bonus Lezen:Hoe u Foreign Key Check in MySQL uitschakelt

Dit is de SQL-query voor MySQL Rollup om totale waarden te berekenen en een totaalrij aan de tabel toe te voegen. Het eindtotaal wordt altijd toegevoegd als de laatste rij, waarbij aan de kolom GROUP BY een NULL-waarde wordt toegewezen.

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

In de bovenstaande zoekopdracht ROLLUPEN we vóór order_date kolom.

Bonus Lezen:Hoe maak je een reeks in MySQL

Als u meer dan één kolom opgeeft in de GROUP BY-component, dan zal MySQL een hiërarchie daartussen aannemen en de gegevens dienovereenkomstig samenvoegen.

Als u bijvoorbeeld

. vermeldt
GROUP BY c1, c2, c3 WITH ROLLUP

dan zal MySQL ervan uitgaan

c1 > c2 > c3

Het is dus belangrijk om voorzichtig te zijn met de volgorde van kolommen in de GROUP BY-clausule, tijdens het gebruik van MySQL Rollup. Stel dat u de volgende tabel heeft.

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

Bonus lezen:twee tabellen vergelijken in MySQL

Hier is de SQL-query om gegevens per product en order_date-kolommen samen te voegen. In dit geval berekent MySQL niet alleen het eindtotaal en weergave aan het einde, maar berekent het ook kolomgewijze subtotalen voor elke kolom die wordt genoemd in de GROUP BY-clausule behalve de laatste, dat wil zeggen, alleen product kolom.

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

In het bovenstaande resultaat ziet u productgewijze totalen en eindtotaal gemarkeerd als vet

Dit is het resultaat als u order_date vermeldt en vervolgens de productkolom in de GROUP BY-clausule. In dit geval berekent MySQL het order_date-gewijs totaal en eindtotaal.

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

Zoals u kunt zien, zijn de resultaten anders als u de volgorde van de kolommen in de GROUP BY-clausule wijzigt. Desalniettemin is MySQL ROLLUP een erg handige manier om snel subtotalen te berekenen en de totale rij in MySQL toe te voegen.

Ubiq maakt het gemakkelijk om gegevens binnen enkele minuten te visualiseren en in realtime dashboards te controleren. Probeer het vandaag nog!

  1. Ik wil de CASE-instructie gebruiken om enkele records in SQL Server 2005 bij te werken

  2. 2 manieren om het compatibiliteitsniveau in Oracle te controleren (SQLcl &SQL*Plus)

  3. Een OBJECT_NAME() ophalen uit een andere database in SQL Server

  4. PostgreSQL accepteert geen kolomalias in WHERE-clausule