Понякога може да се наложи да изчислите общи и междинни суми в 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 улеснява визуализирането на данни за минути и наблюдение в табла за управление в реално време. Опитайте днес!