sql >> Databáze >  >> RDS >> Mysql

Jak používat MySQL Rollup

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!

  1. ZÍSKEJTE DIAGNOSTIKU pomocí příkazu COPY ve funkci Pl/pgsql

  2. Přehled vygenerovaných sloupců pro PostgreSQL

  3. Co je efektivnější:Více tabulek MySQL nebo jedna velká tabulka?

  4. Migrace databáze Oracle z AWS EC2 na AWS RDS, část 2