sql >> Databáze >  >> RDS >> Mysql

Jak vytvořit dynamické kontingenční tabulky v MySQL

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.

  1. Příklady převodu „date“ na „smalldatetime“ v SQL Server (T-SQL)

  2. Django, mod_wsgi, psycopg2 Nesprávně nakonfigurováno:Chyba při načítání modulu psycopg2:Žádný modul s názvem _psycopg

  3. Volání nedefinované funkce oci_connect, php_oci8_12c.dll, windows 8.1, php5.6.6

  4. Instalace Oracle 9i Developer Suite 2.0 na Windows