Soms zijn uw gegevens mogelijk in rijen opgeslagen en wilt u deze mogelijk als kolommen rapporteren. In dergelijke gevallen moet u rijen in kolommen transponeren. Soms kunnen zelfs deze rijen variabel zijn. Zo weet je misschien hoeveel kolommen je nodig hebt. In dergelijke gevallen moet u rijen dynamisch naar kolommen transponeren. Aangezien er geen ingebouwde functie is om dat in MySQL te doen, moet u dit doen met behulp van een SQL-query. Hier is een SQL-query om rijen dynamisch naar kolommen in MySQL te transponeren.
Rijen naar kolommen dynamisch transponeren in MySQL
Hier leest u hoe u dynamische draaitabellen in MySQL kunt maken. Stel dat u de volgende tabel heeft
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 |
+------+------------+------------+-------------+
Stel dat u rijen dynamisch naar kolommen wilt transponeren, zodat er een nieuwe kolom wordt gemaakt voor elke unieke waarde in field_key kolom, dat wil zeggen (voornaam, achternaam, beroep)
+------------+-------------+-------------+-------------+ | Meeting_id | first_name | last_name | occupation | +------------+-------------+-------------+-------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+-------------+-------------+-------------+
Rijen dynamisch naar kolommen transponeren
Als u van tevoren al weet welke kolommen u zou maken, kunt u eenvoudig een CASE-instructie gebruiken om een draaitabel te maken.
Omdat we niet weten welke kolommen moeten worden gemaakt, moeten we rijen dynamisch naar kolommen transponeren met de functie GROUP_CONCAT, zoals hieronder weergegeven
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;
Met GROUP_CONCAT kunt u field_key-waarden van meerdere rijen samenvoegen tot een enkele tekenreeks. In de bovenstaande query gebruiken we GROUP_CONCAT om dynamisch CASE-instructies te maken, gebaseerd op de unieke waarden in field_key kolom en sla die string op in de @sql-variabele, die vervolgens wordt gebruikt om onze selectiequery te maken.
+------------+------------+-----------+------------+ | Meeting_id | first_name | last_name | occupation | +------------+------------+-----------+------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+------------+-----------+------------+
Dit is hoe u draaitabelquery's in MySQL kunt automatiseren en rijen dynamisch naar kolommen kunt transponeren.
U kunt de bovenstaande query aanpassen aan uw vereisten door de WHERE-clausule of JOINS toe te voegen.
Als u alleen geselecteerde rijwaarden als kolommen wilt transponeren, kunt u de WHERE-component toevoegen aan uw eerste select GROUP_CONCAT-instructie.
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when field_key = ''',
field_key,
''' then field_value end) ',
field_key
)
) INTO @sql
FROM
Meeting
WHERE <condition>;
Als u rijen in uw uiteindelijke draaitabel wilt filteren, kunt u de WHERE-component in uw SET-instructie toevoegen.
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, '
FROM Meeting WHERE <condition>
GROUP BY Meeting_id');
Op dezelfde manier kunt u JOINS ook toepassen in uw SQL-query terwijl u rijen dynamisch naar kolommen transponeert in MySQL.
Hier is een voorbeeld van een draaitabel gemaakt met Ubiq.

Als u draaitabellen, grafieken, dashboards en rapporten wilt maken vanuit de MySQL-database, kunt u Ubiq proberen. We bieden een gratis proefperiode van 14 dagen.