Ibland kan du behöva beräkna summor och delsummor i MySQL, eller lägga till totala rader till din data. Det kan vara tråkigt att aggregera data med UNION-satsen, särskilt för att beräkna delsummor. MySQL Rollup är lämplig för sådana användningsfall. Så här använder du MySQL Rollup för att beräkna total och delsumma i MySQL.
Hur man använder MySQL-samling
Här är stegen för att beräkna total och delsumma med MySQL Rollup.
MySQL Rollup låter dig enkelt rulla upp data och beräkna delsummor med ett enda uttalande. Du kan också använda den för att lägga till totala rader och delsumma rader till dina data, istället för att beräkna dem separat och kombinera resultatet med UNION-satsen.
Här är syntaxen för MySQL ROLLUP.
SELECT column1, column2, column3, ... FROM table_name GROUP BY column1, column2,... WITH ROLLUP;
Frågan ovan påminner mycket om att aggregera data med GROUP BY-satsen, förutom att du lägger till nyckelordet WITH ROLLUP efter GROUP BY-satsen.
I ovanstående fråga anger vi kolumnerna vi behöver visa i vårt frågeresultat i SELECT-satsen. Vi måste också nämna tabellnamnet. I GROUP BY-satsen anger vi de kolumner som vi vill aggregera data utifrån.
Bonus Läs:Hur man kontrollerar MySQL-version
Låt oss säga att du har följande tabellförsäljning(order_datum, rea).
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 | +------------+------+
Bonus Läs:Hur man inaktiverar utländsk nyckelkontroll i MySQL
Här är SQL-frågan för MySQL Rollup för att beräkna totala värden och lägga till en total rad i tabellen. Totalsumman läggs alltid till som den sista raden, varvid kolumnen GROUP BY tilldelas NULL-värdet.
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 | +------------+------+
I ovanstående fråga ROLLUP vi senast order_date kolumn.
Bonus Läs:Hur man skapar sekvens i MySQL
Om du anger mer än en kolumn i GROUP BY-satsen kommer MySQL att anta en hierarki mellan dem och samla data i enlighet därmed.
Om du till exempel nämner
GROUP BY c1, c2, c3 WITH ROLLUP
då kommer MySQL att anta
c1 > c2 > c3
Så det är viktigt att vara försiktig med kolumnernas ordning i GROUP BY-satsen när du använder MySQL Rollup. Låt oss säga att du har följande tabell.
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 | +---------+------------+------+
Bonus Läs:Hur man jämför två tabeller i MySQL
Här är SQL-frågan för att samla data efter produkt- och order_date-kolumner. I det här fallet kommer MySQL inte bara att beräkna totalsumman och visa i slutet utan också beräkna kolumnvis delsummor för varje kolumn som nämns i GROUP BY-satsen förutom den sista, det vill säga bara produkt kolumn.
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 | +---------+------------+-----------+
I resultatet ovan kommer du att se produktmässiga totalsummor och totalsumma markerade som fet
Här är resultatet om du nämner order_date och sedan produktkolumnen i GROUP BY-satsen. I det här fallet kommer MySQL att beräkna order_date-wise total och totalsumma.
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 | +---------+------------+-----------+
Som du kan se blir resultaten annorlunda om du ändrar ordningen på kolumner som nämns i GROUP BY-satsen. Ändå är MySQL ROLLUP ett mycket bekvämt sätt att snabbt beräkna delsummor och lägga till total rad i MySQL.
Ubiq gör det enkelt att visualisera data på några minuter och övervaka i realtidsinstrumentpaneler. Prova det idag!