Ibland kan du behöva omvandla rader till kolumner eller skapa pivottabeller för rapporteringsändamål. Eftersom det inte finns någon inbyggd funktion för att uppnå pivot i MySQL, måste du utföra det via SQL-fråga för att skapa pivotrapporttabell. Låt oss se hur du visar radvärden som kolumner i MySQL.
Hur man visar radvärden som kolumner i MySQL
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 överföra rader till kolumner dynamiskt, 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 | +------------+-------------+-------------+-------------+
Visa radvärden som kolumner i MySQL
Om du redan vet vilka kolumner du vill skapa kan du skapa en pivottabell med CASE-satser, som visas nedan, för att visa radvärden som kolumner 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 |
+------------+------------+-----------+------------+
Visa radvärden som kolumner i MySQL dynamiskt
Om du inte känner till kolumnnamnen innan, eller vill visa radvärden som kolumner i MySQL dynamiskt, kan du skapa dynamiska pivottabeller i MySQL med funktionen GROUP_CONCAT, 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 field_key-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å de unika värdena i field_key kolumn och lagra den strängen i @sql-variabeln, som sedan används för att skapa vår urvalsfråga.
+------------+------------+-----------+------------+ | Meeting_id | first_name | last_name | occupation | +------------+------------+-----------+------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+------------+-----------+------------+
Du kan anpassa ovanstående fråga enligt dina krav genom att lägga till WHERE-klausul eller JOINS.
Om du bara vill transponera utvalda radvärden som kolumner, kan du lägga till WHERE-satsen i din första select GROUP_CONCAT-sats.
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.
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 visar radvärden som kolumner i MySQL.
När du har konverterat rad till kolumn i MySQL kan du använda ett diagramverktyg för att plotta resultatet i en tabell. Här är ett exempel på en pivottabell skapad med Ubiq.

Om du vill skapa pivottabeller, diagram och instrumentpaneler från MySQL-databasen kan du prova Ubiq. Vi erbjuder en 14-dagars gratis provperiod.