sql >> Database teknologi >  >> RDS >> Mysql

Sådan bruger du MySQL Rollup

Nogle gange skal du muligvis beregne totaler og subtotaler i MySQL eller tilføje samlede rækker til dine data. Det kan være kedeligt at aggregere data ved hjælp af UNION-sætning, især til at beregne subtotaler. MySQL Rollup er velegnet til sådanne use cases. Sådan bruger du MySQL Rollup til at beregne total og subtotal  i MySQL.

Sådan bruges MySQL Rollup

Her er trinene til at beregne total og subtotal ved hjælp af MySQL Rollup.

MySQL Rollup giver dig mulighed for nemt at rulle data op og beregne subtotaler ved hjælp af en enkelt erklæring. Du kan også bruge det til at tilføje samlede rækker og subtotalrækker til dine data i stedet for at beregne dem separat og kombinere resultatet ved hjælp af UNION-sætning.

Her er syntaksen for MySQL ROLLUP.

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

Ovenstående forespørgsel minder meget om at aggregere data ved hjælp af GROUP BY-sætning, bortset fra at du tilføjer WITH ROLLUP nøgleord efter GROUP BY-sætning.

I ovenstående forespørgsel specificerer vi de kolonner, vi skal vise i vores forespørgselsresultat i SELECT-klausulen. Vi skal også nævne tabellens navn. I GROUP BY-sætning angiver vi de kolonner, som vi ønsker at aggregere data på.

Bonuslæser:Sådan tjekker du MySQL-version

Lad os sige, at du har følgende tabelsalg(ordre_dato, udsalg).

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

Bonuslæser:Sådan deaktiveres tjek af fremmed nøgle i MySQL

Her er SQL-forespørgslen til MySQL Rollup til at beregne samlede værdier og tilføje en samlet række til tabellen. Den samlede sum tilføjes altid som den sidste række, hvor GROUP BY-kolonnen tildeles NULL-værdien.

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

I ovenstående forespørgsel ROLLUP vi ved order_date kolonne.

Bonus Læs:Sådan opretter du sekvens i MySQL

Hvis du angiver mere end én kolonne i GROUP BY-klausulen, antager MySQL et hierarki mellem dem og oprulningsdata i overensstemmelse hermed.

Hvis du f.eks. nævner

GROUP BY c1, c2, c3 WITH ROLLUP

så vil MySQL antage

c1 > c2 > c3

Så det er vigtigt at være forsigtig med rækkefølgen af ​​kolonner i GROUP BY-klausulen, mens du bruger MySQL Rollup. Lad os sige, at du har følgende tabel.

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 Læs:Sådan sammenlignes to tabeller i MySQL

Her er SQL-forespørgslen til at samle data efter produkt- og ordredato-kolonner. I dette tilfælde vil MySQL ikke kun beregne totaltotal og vises i slutningen, men også beregne kolonnevise subtotaler for hver kolonne nævnt i GROUP BY-sætning undtagen den sidste, det vil sige kun produkt kolonne.

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

I ovenstående resultat vil du se produktmæssige totaler og totalsum fremhævet som fed

Her er resultatet, hvis du nævner ordre_dato og derefter produktkolonnen i GROUP BY-klausulen. I dette tilfælde vil MySQL beregne ordre_dato-wise total og total total.

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

Som du kan se, er resultaterne anderledes, hvis du ændrer rækkefølgen af ​​kolonner nævnt i GROUP BY-klausulen. Ikke desto mindre er MySQL ROLLUP en meget bekvem måde til hurtigt at beregne subtotaler og tilføje samlede rækker i MySQL.

Ubiq gør det nemt at visualisere data på få minutter og overvåge i dashboards i realtid. Prøv det i dag!

  1. Returner en liste over databaser i SQLite

  2. Er der nogen forskel mellem IS NULL og =NULL

  3. Hvordan konverterer man antal uger til dato?

  4. Hvordan IIF() virker i SQL Server