Někdy může být potřeba převést řádky do sloupců nebo vytvořit kontingenční tabulky pro účely vytváření přehledů. Vzhledem k tomu, že v MySQL není žádná vestavěná funkce pro dosažení pivotu, musíte to provést pomocí dotazu SQL, abyste vytvořili tabulku pivotních sestav. Podívejme se, jak zobrazit hodnoty řádků jako sloupce v MySQL.
Jak zobrazit hodnoty řádků jako sloupce v MySQL
Řekněme, že máte následující tabulku.
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 |
+------+------------+------------+-------------+
Řekněme, že chcete dynamicky transponovat řádky do sloupců tak, aby se pro každou jedinečnou hodnotu v klíč_pole vytvořil nový sloupec. sloupec, tedy (jméno, příjmení, povolání)
+------------+-------------+-------------+-------------+ | Meeting_id | first_name | last_name | occupation | +------------+-------------+-------------+-------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+-------------+-------------+-------------+
Zobrazení hodnot řádků jako sloupců v MySQL
Pokud již víte, které sloupce chcete vytvořit, můžete vytvořit kontingenční tabulku pomocí příkazů CASE, jak je uvedeno níže, a zobrazit tak hodnoty řádků jako sloupce v 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 |
+------------+------------+-----------+------------+
Dynamicky zobrazovat hodnoty řádků jako sloupce v MySQL
Pokud předem neznáte názvy sloupců nebo chcete dynamicky zobrazovat hodnoty řádků jako sloupce v MySQL, můžete vytvořit dynamické kontingenční tabulky v MySQL pomocí funkce GROUP_CONCAT, jak je uvedeno níže.
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 umožňuje zřetězit hodnoty field_key z více řádků do jednoho řetězce. Ve výše uvedeném dotazu používáme GROUP_CONCAT k dynamickému vytváření příkazů CASE na základě jedinečných hodnot v field_key a uložte tento řetězec do proměnné @sql, která se pak použije k vytvoření našeho výběrového dotazu.
+------------+------------+-----------+------------+ | Meeting_id | first_name | last_name | occupation | +------------+------------+-----------+------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+------------+-----------+------------+
Výše uvedený dotaz můžete upravit podle svých požadavků přidáním klauzule WHERE nebo JOINS.
Pokud chcete jako sloupce transponovat pouze vybrané hodnoty řádků, můžete do prvního příkazu select GROUP_CONCAT přidat klauzuli WHERE.
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when field_key = ''',
field_key,
''' then field_value end) ',
field_key
)
) INTO @sql
FROM
Meeting
WHERE <condition>;
Pokud chcete ve své konečné kontingenční tabulce filtrovat řádky, můžete do příkazu SET přidat klauzuli WHERE.
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, '
FROM Meeting WHERE <condition>
GROUP BY Meeting_id');
Podobně můžete také použít JOINS ve svém dotazu SQL, zatímco v MySQL zobrazujete hodnoty řádků jako sloupce.
Poté, co v MySQL převedete řádek na sloupec, můžete použít nástroj pro vytváření grafů k vykreslení výsledku do tabulky. Zde je příklad kontingenční tabulky vytvořené pomocí Ubiq.

Pokud chcete vytvářet kontingenční tabulky, grafy a dashboardy z databáze MySQL, můžete zkusit Ubiq. Nabízíme 14denní bezplatnou zkušební verzi.