Soms moet u mogelijk rijen omzetten in kolommen of draaitabellen maken voor rapportagedoeleinden. Aangezien er geen ingebouwde functie is om een draaipunt in MySQL te bereiken, moet u dit doen via een SQL-query om een draairapporttabel te maken. Laten we eens kijken hoe rijwaarden als kolommen in MySQL kunnen worden weergegeven.
Rijwaarden weergeven als kolommen in MySQL
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 is (voornaam, achternaam, beroep)
+------------+-------------+-------------+-------------+ | Meeting_id | first_name | last_name | occupation | +------------+-------------+-------------+-------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+-------------+-------------+-------------+
Rijwaarden weergeven als kolommen in MySQL
Als u al weet welke kolommen u wilt maken, kunt u een draaitabel maken met CASE-instructies, zoals hieronder weergegeven, om rijwaarden als kolommen in MySQL weer te geven.
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 | +------------+------------+-----------+------------+
Rijwaarden dynamisch weergeven als kolommen in MySQL
Als u de kolomnamen niet van tevoren weet, of rijwaarden dynamisch wilt weergeven als kolommen in MySQL, kunt u dynamische draaitabellen in MySQL maken 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 | +------------+------------+-----------+------------+
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 rijwaarden als kolommen in MySQL weergeeft.
Nadat u rij naar kolom in MySQL hebt geconverteerd, kunt u een diagramtool gebruiken om het resultaat in een tabel uit te zetten. Hier is een voorbeeld van een draaitabel gemaakt met Ubiq.
Als u draaitabellen, grafieken en dashboards wilt maken vanuit de MySQL-database, kunt u Ubiq proberen. We bieden een gratis proefperiode van 14 dagen aan.