Někdy může být potřeba vypočítat součty a mezisoučty v MySQL nebo přidat k datům celkové řádky. Může být únavné agregovat data pomocí příkazu UNION, zejména pro výpočet mezisoučtů. Pro takové případy použití je vhodný MySQL Rollup. Zde je návod, jak použít MySQL Rollup k výpočtu součtu a mezisoučtu v MySQL.
Jak používat MySQL Rollup
Zde jsou kroky k výpočtu součtu a mezisoučtu pomocí MySQL Rollup.
MySQL Rollup vám umožňuje snadno shrnout data a vypočítat mezisoučty pomocí jediného příkazu. Můžete jej také použít k přidání řádků součtu a řádků mezisoučtu k vašim datům namísto jejich samostatného výpočtu a kombinování výsledku pomocí příkazu UNION.
Zde je syntaxe MySQL ROLLUP.
SELECT column1, column2, column3, ... FROM table_name GROUP BY column1, column2,... WITH ROLLUP;
Výše uvedený dotaz je velmi podobný agregaci dat pomocí příkazu GROUP BY, kromě toho, že za klauzuli GROUP BY přidáte klíčové slovo WITH ROLLUP.
Ve výše uvedeném dotazu specifikujeme sloupce, které potřebujeme zobrazit ve výsledku našeho dotazu v klauzuli SELECT. Musíme také zmínit název tabulky. V klauzuli GROUP BY specifikujeme sloupce, na základě kterých chceme agregovat data.
Bonusové čtení:Jak zkontrolovat verzi MySQL
Řekněme, že máte následující tabulku 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 | +------------+------+
Bonusové čtení:Jak zakázat kontrolu cizího klíče v MySQL
Zde je dotaz SQL pro MySQL Rollup pro výpočet celkových hodnot a přidání celkového řádku do tabulky. Celkový součet je vždy přidán jako poslední řádek, přičemž sloupci GROUP BY je přiřazena hodnota 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 | +------------+------+
Ve výše uvedeném dotazu provedeme ROLLUP do order_date sloupec.
Bonusové čtení:Jak vytvořit sekvenci v MySQL
Pokud zadáte více než jeden sloupec v klauzuli GROUP BY, pak MySQL mezi nimi převezme hierarchii a odpovídajícím způsobem souhrnná data.
Pokud například zmíníte
GROUP BY c1, c2, c3 WITH ROLLUP
pak MySQL bude předpokládat
c1 > c2 > c3
Při používání MySQL Rollup je tedy důležité dávat pozor na pořadí sloupců v klauzuli GROUP BY. Řekněme, že máte následující tabulku.
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 | +---------+------------+------+
Bonusové čtení:Jak porovnat dvě tabulky v MySQL
Zde je dotaz SQL pro souhrn dat podle sloupců produktu a objednávky. V tomto případě MySQL nejen vypočítá celkový součet a zobrazí na konci, ale také vypočítá mezisoučty po sloupcích pro každý sloupec uvedený v klauzuli GROUP BY kromě posledního, tedy pouze produkt sloupec.
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 | +---------+------------+-----------+
Ve výše uvedeném výsledku uvidíte součty týkající se produktů a celkový součet zvýrazněné tučně
Zde je výsledek, pokud v klauzuli GROUP BY zmíníte datum objednávky a poté sloupec produktu. V tomto případě MySQL vypočítá součet podle data objednávky a celkový součet.
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 vidíte, výsledky se liší, pokud změníte pořadí sloupců zmíněných v klauzuli GROUP BY. Nicméně MySQL ROLLUP je velmi pohodlný způsob, jak rychle vypočítat mezisoučty a přidat celkový řádek v MySQL.
Ubiq usnadňuje vizualizaci dat během několika minut a sledování na řídicích panelech v reálném čase. Vyzkoušejte to ještě dnes!