Nogle gange kan det være nødvendigt at transponere rækker til kolonner eller oprette pivottabeller til rapporteringsformål. Da der ikke er nogen indbygget funktion til at opnå pivot i MySQL, skal du udføre det via SQL-forespørgsel for at oprette pivotrapporttabel. Lad os se, hvordan du viser rækkeværdier som kolonner i MySQL.
Sådan vises rækkeværdier som kolonner i MySQL
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 transponere rækker til kolonner dynamisk, således 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 | +------------+-------------+-------------+-------------+
Vis rækkeværdier som kolonner i MySQL
Hvis du allerede ved, hvilke kolonner du vil oprette, kan du oprette en pivottabel ved hjælp af CASE-sætninger, som vist nedenfor, for at vise rækkeværdier som kolonner i MySQL.
mysql> select meeting_Id, max(case when (field_key='first_name') then field_value else NULL end) as 'first_name', max(case when (field_key='last_name') then field_value else NULL end) as 'last_name', max(case when (field_key='occupation') then field_value else NULL end) as 'occupation' from meeting group by meeting_Id order by meeting_Id; +------------+------------+-----------+------------+ | meeting_Id | first_name | last_name | occupation | +------------+------------+-----------+------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+------------+-----------+------------+
Vis rækkeværdier som kolonner i MySQL dynamisk
Hvis du ikke kender kolonnenavnene i forvejen eller ønsker at vise rækkeværdier som kolonner i MySQL dynamisk, kan du oprette dynamiske pivottabeller i MySQL ved hjælp af GROUP_CONCAT-funktionen, 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 feltnøgleværdier fra flere rækker til en enkelt streng. I ovenstående forespørgsel bruger vi GROUP_CONCAT til dynamisk at oprette CASE-sætninger baseret på de unikke værdier i field_key kolonne og gem den streng i @sql variabel, som derefter bruges til at oprette vores udvalgte forespørgsel.
+------------+------------+-----------+------------+ | Meeting_id | first_name | last_name | occupation | +------------+------------+-----------+------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+------------+-----------+------------+
Du kan tilpasse ovenstående forespørgsel efter dine krav ved at tilføje WHERE-klausul eller JOINS.
Hvis du kun vil transponere udvalgte rækkeværdier som kolonner, kan du tilføje WHERE-sætning i din 1. select GROUP_CONCAT-sætning.
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.
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 viser rækkeværdier som kolonner i MySQL.
Når du har konverteret række til kolonne i MySQL, kan du bruge et diagramværktøj til at plotte resultatet i en tabel. Her er et eksempel på en pivottabel oprettet ved hjælp af Ubiq.
Hvis du vil oprette pivottabeller, diagrammer og dashboards fra MySQL-databasen, kan du prøve Ubiq. Vi tilbyder en 14-dages gratis prøveperiode.