Pivottabeller gør det nemt at analysere store mængder data ved at organisere information i et mindre, håndterbart datasæt. Der er dog ingen indbygget funktion til at opnå pivot i MySQL. Vi skal skrive en SQL-forespørgsel for at konvertere række til kolonne i MySQL og derefter oprette en pivotrapport i MySQL. Så lad os se på, hvordan man opretter dynamiske pivottabeller i MySQL.
Sådan opretter du dynamiske pivottabeller i MySQL
Hvis du vil oprette en pivottabel i MySQL, vil du typisk bruge IF/CASE-sætninger. Denne tilgang virker dog kun, når du allerede kender alle de kolonner, du skal oprette i en pivottabel.
Hvordan opretter du dynamiske pivottabeller i MySQL, når du ikke kender kolonnerne, der skal oprettes, eller hvis du forventer, at de ændrer sig over tid? I sådanne tilfælde bruger vi GROUP_CONCAT funktion.
Lad os sige, at du har følgende tabel
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 |
+------+------------+------------+-------------+
Lad os sige, at du vil oprette en dynamisk pivottabel, sådan at der oprettes en ny kolonne for hver unik værdi i field_key kolonne, det vil sige (fornavn, efternavn, stilling)
+------------+-------------+-------------+-------------+ | Meeting_id | first_name | last_name | occupation | +------------+-------------+-------------+-------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+-------------+-------------+-------------+
Opret dynamiske pivottabeller i MySQL
Hvis du allerede ved, hvilke kolonner du skal oprette i pivottabel, kan du bruge en CASE-sætning til at oprette en pivottabel. For at oprette dynamiske pivottabeller i MySQL bruger vi dog GROUP_CONCAT funktion til dynamisk at transponere rækker til kolonner, som vist nedenfor.
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 giver dig mulighed for at sammenkæde værdier fra flere rækker til en enkelt streng. I ovenstående forespørgsel bruger vi GROUP_CONCAT til dynamisk at skabe CASE-udsagn baseret på unikke værdier i field_key kolonne og gem den streng i @sql variabel. Den bruges derefter til at oprette vores udvalgte forespørgsel.
+------------+------------+-----------+------------+ | Meeting_id | first_name | last_name | occupation | +------------+------------+-----------+------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+------------+-----------+------------+
På denne måde kan du automatisere pivottabelforespørgsler i MySQL.
Du kan tilpasse ovenstående forespørgsel efter dine krav ved at tilføje WHERE-klausul eller JOINS.
Hvis du kun vil pivotere udvalgte rækkeværdier som kolonner, kan du tilføje WHERE-sætning i din 1st select GROUP_CONCAT-sætning, som vist med fed nedenfor
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when field_key = ''',
field_key,
''' then field_value end) ',
field_key
)
) INTO @sql
FROM
Meeting
WHERE <condition>;
Hvis du vil filtrere rækker i din sidste pivottabel, kan du tilføje WHERE-sætningen i din SET-sætning som vist med fed nedenfor.
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, '
FROM Meeting WHERE <condition>
GROUP BY Meeting_id');
På samme måde kan du også anvende JOINS i din SQL-forespørgsel, mens du opretter dynamiske pivottabeller i MySQL.
Når du har oprettet dynamiske pivottabeller i MySQL, kan du bruge et rapporteringsværktøj til at plotte det i en tabel. Her er et eksempel på pivottabel oprettet ved hjælp af Ubiq.

Vidste du, at du kan oprette dynamiske pivottabeller i Ubiq uden at skrive SQL?
Forresten, hvis du vil oprette pivottabeller, diagrammer og dashboards fra MySQL-databasen, kan du prøve Ubiq. Vi tilbyder en 14-dages gratis prøveperiode.