Pivottabeller gör det enkelt att analysera stora datamängder genom att organisera information i en mindre, hanterbar datamängd. Det finns dock ingen inbyggd funktion för att uppnå pivot i MySQL. Vi måste skriva en SQL-fråga för att konvertera rad till kolumn i MySQL och sedan skapa en pivotrapport i MySQL. Så låt oss titta på hur man skapar dynamiska pivottabeller i MySQL.
Hur man skapar dynamiska pivottabeller i MySQL
Om du vill skapa en pivottabell i MySQL, använder du vanligtvis IF/CASE-satser. Det här tillvägagångssättet fungerar dock bara när du redan känner till alla kolumner du behöver skapa i en pivottabell.
Hur skapar du dynamiska pivottabeller i MySQL, när du inte vet vilka kolumner som ska skapas, eller om du förväntar dig att de kommer att förändras över tiden? I sådana fall använder vi GROUP_CONCAT funktion.
Låt oss säga att du har följande tabell
CREATE TABLE Meeting ( ID INT, Meeting_id INT, field_key VARCHAR(100), field_value VARCHAR(100) ); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (1, 1,'first_name' , 'Alec'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (2, 1,'last_name' , 'Jones'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (3, 1,'occupation' , 'engineer'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (4,2,'first_name' , 'John'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (5,2,'last_name' , 'Doe'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (6,2,'occupation' , 'engineer'); +------+------------+------------+-------------+ | ID | Meeting_id | field_key | field_value | +------+------------+------------+-------------+ | 1 | 1 | first_name | Alec | | 2 | 1 | last_name | Jones | | 3 | 1 | occupation | engineer | | 4 | 2 | first_name | John | | 5 | 2 | last_name | Doe | | 6 | 2 | occupation | engineer | +------+------------+------------+-------------+
Låt oss säga att du vill skapa en dynamisk pivottabell, så att en ny kolumn skapas för varje unikt värde i field_key kolumn, det vill säga (förnamn, efternamn, yrke)
+------------+-------------+-------------+-------------+ | Meeting_id | first_name | last_name | occupation | +------------+-------------+-------------+-------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+-------------+-------------+-------------+
Skapa dynamiska pivottabeller i MySQL
Om du redan vet vilka kolumner du ska skapa i pivottabellen kan du använda en CASE-sats för att skapa en pivottabell. Men för att skapa dynamiska pivottabeller i MySQL använder vi GROUP_CONCAT funktion för att dynamiskt överföra rader till kolumner, som visas nedan.
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when field_key = ''', field_key, ''' then field_value end) ', field_key ) ) INTO @sql FROM Meeting; SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' FROM Meeting GROUP BY Meeting_id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
GROUP_CONCAT låter dig sammanfoga värden från flera rader till en enda sträng. I ovanstående fråga använder vi GROUP_CONCAT för att dynamiskt skapa CASE-satser, baserat på unika värden i fältnyckeln kolumn och lagra den strängen i variabeln @sql. Den används sedan för att skapa vår urvalsfråga.
+------------+------------+-----------+------------+ | Meeting_id | first_name | last_name | occupation | +------------+------------+-----------+------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+------------+-----------+------------+
På så sätt kan du automatisera pivottabellsfrågor i MySQL.
Du kan anpassa ovanstående fråga enligt dina krav genom att lägga till WHERE-klausul eller JOINS.
Om du bara vill pivotera valda radvärden som kolumner, kan du lägga till WHERE-satsen i din första select GROUP_CONCAT-sats, som visas i fetstil nedan
SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when field_key = ''', field_key, ''' then field_value end) ', field_key ) ) INTO @sql FROM Meeting WHERE <condition>;
Om du vill filtrera rader i din sista pivottabell kan du lägga till WHERE-satsen i din SET-sats som visas i fetstil nedan.
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' FROM Meeting WHERE <condition> GROUP BY Meeting_id');
På samma sätt kan du också använda JOINS i din SQL-fråga medan du skapar dynamiska pivottabeller i MySQL.
När du väl har skapat dynamiska pivottabeller i MySQL kan du använda ett rapportverktyg för att plotta det i en tabell. Här är ett exempel på en pivottabell skapad med Ubiq.
Visste du att du kan skapa dynamiska pivottabeller i Ubiq utan att skriva någon SQL?
Förresten, om du vill skapa pivottabeller, diagram &instrumentpaneler från MySQL-databasen kan du prova Ubiq. Vi erbjuder en 14-dagars gratis provperiod.