Czasami może być konieczne obliczenie sum i podsum w MySQL lub dodanie wierszy sum do danych. Agregacja danych za pomocą zestawienia UNION może być żmudna, zwłaszcza w celu obliczenia sum częściowych. MySQL Rollup jest odpowiedni do takich przypadków użycia. Oto jak używać MySQL Rollup do obliczania sumy całkowitej i sumy częściowej w MySQL.
Jak używać pakietu zbiorczego MySQL
Oto kroki, aby obliczyć sumę całkowitą i sumę częściową za pomocą pakietu zbiorczego MySQL.
MySQL Rollup umożliwia łatwe zestawianie danych i obliczanie sum częściowych za pomocą jednego polecenia. Możesz go również użyć do dodania wierszy sum i sum częściowych do danych, zamiast obliczania ich osobno i łączenia wyniku za pomocą instrukcji UNION.
Oto składnia MySQL ROLLUP.
SELECT column1, column2, column3, ... FROM table_name GROUP BY column1, column2,... WITH ROLLUP;
Powyższe zapytanie jest bardzo podobne do agregowania danych przy użyciu instrukcji GROUP BY, z tą różnicą, że dodajesz słowo kluczowe WITH ROLLUP po klauzuli GROUP BY.
W powyższym zapytaniu określamy kolumny, które musimy wyświetlić w wyniku zapytania w klauzuli SELECT. Musimy również wspomnieć o nazwie tabeli. W klauzuli GROUP BY określamy kolumny, na podstawie których chcemy agregować dane.
Przeczytaj bonus:Jak sprawdzić wersję MySQL
Załóżmy, że masz następującą tabelę sprzedaży (data_zamówienia, sprzedaż).
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 | +------------+------+
Przeczytaj bonus:Jak wyłączyć sprawdzanie klucza obcego w MySQL
Oto zapytanie SQL dla pakietu zbiorczego MySQL w celu obliczenia wartości całkowitych i dodania wiersza sumy do tabeli. Suma końcowa jest zawsze dodawana jako ostatni wiersz, a kolumna GROUP BY ma przypisaną wartość 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 | +------------+------+
W powyższym zapytaniu ROLLUJEMY do data_zamówienia kolumna.
Przeczytaj bonus:Jak tworzyć sekwencję w MySQL
Jeśli określisz więcej niż jedną kolumnę w klauzuli GROUP BY, MySQL przyjmie hierarchię między nimi i odpowiednio dane zestawienia.
Na przykład, jeśli wspomnisz
GROUP BY c1, c2, c3 WITH ROLLUP
wtedy MySQL przyjmie
c1 > c2 > c3
Dlatego ważne jest, aby uważać na kolejność kolumn w klauzuli GROUP BY podczas korzystania z MySQL Rollup. Załóżmy, że masz poniższą 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 | +---------+------------+------+
Przeczytaj bonus:Jak porównać dwie tabele w MySQL
Oto zapytanie SQL do zestawienia danych według kolumn produktu i daty_zamówienia. W takim przypadku MySQL nie tylko obliczy sumę końcową i wyświetli na końcu, ale także obliczy podsumy dla każdej kolumny wymienionej w klauzuli GROUP BY z wyjątkiem ostatniej, czyli tylko produktu kolumna.
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 | +---------+------------+-----------+
W powyższym wyniku zobaczysz sumy produktów i sumę końcową wyróżnione jako pogrubione
Oto wynik, jeśli wymienisz order_date, a następnie kolumnę produktu w klauzuli GROUP BY. W takim przypadku MySQL obliczy sumę i sumę całkowitą według daty zamówienia.
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 | +---------+------------+-----------+
Jak widać wyniki są różne, jeśli zmienisz kolejność kolumn wymienionych w klauzuli GROUP BY. Niemniej jednak, ROLLUP MySQL jest bardzo wygodnym sposobem szybkiego obliczania sum częściowych i dodawania wierszy całkowitych w MySQL.
Ubiq ułatwia wizualizację danych w ciągu kilku minut i monitorowanie w pulpitach nawigacyjnych w czasie rzeczywistym. Wypróbuj już dziś!