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

Jak dynamicky transponovat řádky do sloupců v MySQL

Někdy mohou být vaše data uložena v řádcích a možná je budete chtít vykázat jako sloupce. V takových případech budete muset transponovat řádky do sloupců. Někdy mohou být i tyto řádky variabilní. Takže možná víte, kolik sloupců potřebujete. V takových případech je třeba dynamicky transponovat řádky do sloupců. Protože v MySQL neexistuje žádná vestavěná funkce, která by to dělala, musíte to provést pomocí dotazu SQL. Zde je dotaz SQL pro dynamickou transpozici řádků do sloupců v MySQL.

Jak dynamicky transponovat řádky do sloupců v MySQL

Zde je návod, jak vytvořit dynamické kontingenční tabulky 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    |
+------------+-------------+-------------+-------------+

Dynamicky převádět řádky na sloupce

Pokud již předem víte, které sloupce byste vytvořili, můžete k vytvoření kontingenční tabulky jednoduše použít příkaz CASE.

Protože nevíme, které sloupce se mají vytvořit, budeme muset dynamicky transponovat řádky do sloupců pomocí funkce GROUP_CONCAT, 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 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   |
+------------+------------+-----------+------------+

Takto můžete automatizovat dotazy na kontingenční tabulky v MySQL a dynamicky transponovat řádky do sloupců.

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 dynamicky transponujete řádky do sloupců v MySQL.

Zde je příklad kontingenční tabulky vytvořené pomocí Ubiq.

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

  1. Jak nasadit vysoce dostupný Canvas LMS s databázovým clusterem PostgreSQL

  2. MariaDB Connector/Python Beta nyní k dispozici

  3. Výkon MySQL:MyISAM vs InnoDB

  4. Spouštěč s názvem dynamického pole