A volte potrebbe essere necessario calcolare totali e subtotali in MySQL o aggiungere righe totali ai dati. Può essere noioso aggregare i dati usando l'istruzione UNION soprattutto per calcolare i subtotali. MySQL Rollup è adatto per tali casi d'uso. Ecco come utilizzare MySQL Rollup per calcolare il totale e il subtotale in MySQL.
Come utilizzare MySQL Rollup
Ecco i passaggi per calcolare il totale e il subtotale utilizzando MySQL Rollup.
MySQL Rollup consente di eseguire facilmente il rollup dei dati e calcolare i totali parziali utilizzando un'unica istruzione. Puoi anche usarlo per aggiungere righe totali e righe totali parziali ai tuoi dati, invece di calcolarli separatamente e combinare il risultato utilizzando l'istruzione UNION.
Ecco la sintassi di MySQL ROLLUP.
SELECT column1, column2, column3, ... FROM table_name GROUP BY column1, column2,... WITH ROLLUP;
La query precedente è molto simile all'aggregazione dei dati utilizzando l'istruzione GROUP BY, tranne per il fatto che aggiungi la parola chiave WITH ROLLUP dopo la clausola GROUP BY.
Nella query precedente, specifichiamo le colonne che dobbiamo visualizzare nel risultato della nostra query nella clausola SELECT. Dobbiamo anche menzionare il nome della tabella. Nella clausola GROUP BY, specifichiamo le colonne in base alle quali vogliamo aggregare i dati.
Bonus Leggi:Come controllare la versione di MySQL
Supponiamo che tu abbia la seguente tabella vendite (data_ordine, vendita).
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 Leggi:come disabilitare il controllo della chiave esterna in MySQL
Ecco la query SQL per MySQL Rollup per calcolare i valori totali e aggiungere una riga totale alla tabella. Il totale generale viene sempre aggiunto come ultima riga, con il valore NULL assegnato alla colonna GROUP BY.
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 | +------------+------+
Nella query precedente eseguiamo il ROLLUP entro data_ordine colonna.
Bonus Leggi:Come creare una sequenza in MySQL
Se specifichi più di una colonna nella clausola GROUP BY, MySQL assumerà una gerarchia tra di esse e eseguirà il rollup dei dati di conseguenza.
Ad esempio, se menzioni
GROUP BY c1, c2, c3 WITH ROLLUP
quindi MySQL assumerà
c1 > c2 > c3
Quindi è importante prestare attenzione all'ordine delle colonne nella clausola GROUP BY, durante l'utilizzo di MySQL Rollup. Supponiamo che tu abbia la seguente tabella.
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 Leggi:Come confrontare due tabelle in MySQL
Ecco la query SQL per eseguire il rollup dei dati in base alle colonne product e order_date. In questo caso, MySQL non solo calcolerà il totale generale e lo visualizzerà alla fine, ma calcolerà anche i totali parziali per colonna per ciascuna colonna menzionata nella clausola GROUP BY eccetto l'ultima, ovvero solo prodotto colonna.
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 | +---------+------------+-----------+
Nel risultato precedente, vedrai i totali relativi al prodotto e il totale generale evidenziati in grassetto
Ecco il risultato se menzioni order_date e poi la colonna del prodotto nella clausola GROUP BY. In questo caso, MySQL calcolerà il totale order_date-wise e il totale generale.
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 | +---------+------------+-----------+
Come puoi vedere, i risultati sono diversi se modifichi l'ordine delle colonne menzionate nella clausola GROUP BY. Tuttavia, MySQL ROLLUP è un modo molto conveniente per calcolare rapidamente i totali parziali e aggiungere righe totali in MySQL.
Ubiq semplifica la visualizzazione dei dati in pochi minuti e il monitoraggio in dashboard in tempo reale. Provalo oggi!