Kontingenční tabulky usnadňují analýzu velkých objemů dat uspořádáním informací do menší, spravovatelné datové sady. Neexistuje však žádná vestavěná funkce pro dosažení pivotu v MySQL. Potřebujeme napsat SQL dotaz, abychom převedli řádek na sloupec v MySQL, a pak vytvořit kontingenční sestavu v MySQL. Pojďme se tedy podívat na to, jak vytvořit dynamické kontingenční tabulky v MySQL.
Jak vytvořit dynamické kontingenční tabulky v MySQL
Pokud chcete vytvořit kontingenční tabulku v MySQL, obvykle byste použili příkazy IF/CASE. Tento přístup však funguje pouze v případě, že již znáte všechny sloupce, které potřebujete v kontingenční tabulce vytvořit.
Jak vytvoříte dynamické kontingenční tabulky v MySQL, když neznáte sloupce, které se mají vytvořit, nebo pokud očekáváte, že se časem změní? V takových případech používáme GROUP_CONCAT funkce.
Ř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 vytvořit dynamickou kontingenční tabulku, 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 | +------------+-------------+-------------+-------------+
Vytvářejte dynamické kontingenční tabulky v MySQL
Pokud již víte, které sloupce v kontingenční tabulce vytvořit, můžete k vytvoření kontingenční tabulky použít příkaz CASE. K vytváření dynamických kontingenčních tabulek v MySQL však používáme GROUP_CONCAT funkce pro dynamickou transpozici řádků do sloupců, jak je znázorněno 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 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 key_key sloupec a uložte tento řetězec do proměnné @sql. Poté se 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 | +------------+------------+-----------+------------+
Tímto způsobem můžete automatizovat dotazy na kontingenční tabulky v MySQL.
Výše uvedený dotaz můžete upravit podle svých požadavků přidáním klauzule WHERE nebo JOINS.
Pokud chcete jako sloupce kontingentovat pouze vybrané hodnoty řádků, můžete do prvního příkazu select GROUP_CONCAT přidat klauzuli WHERE, jak je znázorněno tučně níže
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, jak je znázorněno tučně níže.
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 při vytváření dynamických kontingenčních tabulek v MySQL.
Jakmile v MySQL vytvoříte dynamické kontingenční tabulky, můžete je pomocí nástroje pro vytváření sestav vykreslit do tabulky. Zde je příklad kontingenční tabulky vytvořené pomocí Ubiq.
Věděli jste, že v Ubiq můžete vytvářet dynamické kontingenční tabulky, aniž byste museli psát SQL?
Mimochodem, 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.