Понякога може да се наложи да изчислите общи и междинни суми в MySQL или да добавите общи редове към вашите данни. Може да е досадно да се агрегират данни с помощта на UNION израз, особено за изчисляване на междинни суми. MySQL Rollup е подходящ за такива случаи на употреба. Ето как да използвате MySQL Rollup за изчисляване на общата и междинната сума в MySQL.
Как да използвам MySQL Rollup
Ето стъпките за изчисляване на общия и междинен сбор с помощта на MySQL Rollup.
MySQL Rollup ви позволява лесно да събирате данни и да изчислявате междинни суми с помощта на едно изявление. Можете също да го използвате, за да добавите общи редове и редове за междинна сума към вашите данни, вместо да ги изчислявате отделно и да комбинирате резултата с помощта на оператор UNION.
Ето синтаксиса на MySQL ROLLUP.
SELECT
column1, column2, column3, ...
FROM
table_name
GROUP BY
column1, column2,... WITH ROLLUP;
Горната заявка е много подобна на агрегирането на данни чрез оператор GROUP BY, с изключение на това, че добавяте ключова дума WITH ROLLUP след клауза GROUP BY.
В горната заявка ние посочваме колоните, които трябва да покажем в резултата от нашата заявка в клауза SELECT. Трябва да споменем и името на таблицата. В клаузата GROUP BY указваме колоните, въз основа на които искаме да обобщим данните.
Бонус четене:Как да проверите версията на MySQL
Да приемем, че имате следната таблица 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 |
+------------+------+
Бонус четене:Как да деактивирате проверката на чужд ключ в MySQL
Ето SQL заявката за MySQL Rollup за изчисляване на общите стойности и добавяне на общ ред към таблицата. Общата сума винаги се добавя като последен ред, като на колоната GROUP BY се присвоява стойност 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 |
+------------+------+
В заявката по-горе ние РЪПВАМЕ по order_date колона.
Бонус четене:Как да създадете последователност в MySQL
Ако посочите повече от една колона в клаузата GROUP BY, тогава MySQL ще приеме йерархия между тях и сборните данни съответно.
Например, ако споменете
GROUP BY c1, c2, c3 WITH ROLLUP
тогава MySQL ще приеме
c1 > c2 > c3
Затова е важно да внимавате с реда на колоните в клаузата GROUP BY, докато използвате MySQL Rollup. Да приемем, че имате следната таблица.
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 |
+---------+------------+------+
Бонус четене:Как да сравним две таблици в MySQL
Ето SQL заявката за събиране на данни по колони продукт и дата_на поръчка. В този случай MySQL не само ще изчисли общата сума и ще покаже в края, но също ще изчисли междинните суми по колони за всяка колона, спомената в клаузата GROUP BY, с изключение на последната, тоест само продукт колона.
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 |
+---------+------------+-----------+
В горния резултат ще видите общите суми и общия сбор, подчертани като удебелен
Ето резултата, ако споменете order_date и след това колона продукт в клауза GROUP BY. В този случай MySQL ще изчисли общата сума и общата сума според датата на поръчка.
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 |
+---------+------------+-----------+
Както можете да видите, резултатите са различни, ако промените реда на колоните, споменати в клаузата GROUP BY. Въпреки това MySQL ROLLUP е много удобен начин за бързо изчисляване на междинни суми и добавяне на общия ред в MySQL.
Ubiq улеснява визуализирането на данни за минути и наблюдение в табла за управление в реално време. Опитайте днес!