Mysql
 sql >> Database >  >> RDS >> Mysql

Come creare tabelle pivot dinamiche in MySQL

Le tabelle pivot semplificano l'analisi di grandi volumi di dati organizzando le informazioni in un set di dati più piccolo e gestibile. Tuttavia, non esiste una funzione integrata per ottenere il pivot in MySQL. Abbiamo bisogno di scrivere una query SQL per convertire una riga in una colonna in MySQL, quindi creare un rapporto pivot in MySQL. Diamo quindi un'occhiata a come creare tabelle pivot dinamiche in MySQL.

Come creare tabelle pivot dinamiche in MySQL

Se vuoi creare una tabella pivot in MySQL, in genere utilizzeresti le istruzioni IF/CASE. Tuttavia, questo approccio funziona solo quando conosci già tutte le colonne che devi creare in una tabella pivot.

Come si creano tabelle pivot dinamiche in MySQL, quando non si conoscono le colonne da creare o se si prevede che cambino nel tempo? In questi casi, utilizziamo il GROUP_CONCAT funzione.

Supponiamo che tu abbia la seguente tabella

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    |
+------+------------+------------+-------------+

Supponiamo che tu voglia creare una tabella pivot dinamica, in modo tale che venga creata una nuova colonna per ogni valore univoco in field_key colonna, ovvero (nome, cognome, occupazione)

+------------+-------------+-------------+-------------+
| Meeting_id | first_name  |  last_name  |  occupation |
+------------+-------------+-------------+-------------+
|          1 |       Alec  | Jones       | engineer    |
|          2 |       John  | Doe         | engineer    |
+------------+-------------+-------------+-------------+

Crea tabelle pivot dinamiche in MySQL

Se sai già quali colonne creare nella tabella pivot, puoi utilizzare un'istruzione CASE per creare una tabella pivot. Tuttavia, per creare tabelle pivot dinamiche in MySQL, utilizziamo GROUP_CONCAT funzione per trasporre dinamicamente le righe in colonne, come mostrato di seguito.

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 consente di concatenare i valori di più righe in un'unica stringa. Nella query precedente, utilizziamo GROUP_CONCAT per creare dinamicamente istruzioni CASE, basate su valori univoci nella field_key colonna e memorizza quella stringa nella variabile @sql. Viene quindi utilizzato per creare la nostra query di selezione.

+------------+------------+-----------+------------+
| Meeting_id | first_name | last_name | occupation |
+------------+------------+-----------+------------+
|          1 | Alec       | Jones     | engineer   |
|          2 | John       | Doe       | engineer   |
+------------+------------+-----------+------------+

In questo modo puoi automatizzare le query della tabella pivot in MySQL.

Puoi personalizzare la query di cui sopra in base alle tue esigenze aggiungendo la clausola WHERE o JOINS.

Se vuoi trasformare solo i valori di riga selezionati come colonne, puoi aggiungere la clausola WHERE nella tua prima istruzione GROUP_CONCAT select, come mostrato in grassetto sotto

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when field_key = ''',
      field_key,
      ''' then field_value end) ',
      field_key
    )
  ) INTO @sql
FROM
  Meeting
WHERE <condition>;

Se desideri filtrare le righe nella tabella pivot finale, puoi aggiungere la clausola WHERE nell'istruzione SET come mostrato in grassetto sotto.

SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' 
                  FROM Meeting WHERE <condition>
                   GROUP BY Meeting_id');

Allo stesso modo, puoi anche applicare JOINS nella tua query SQL mentre crei tabelle pivot dinamiche in MySQL.

Dopo aver creato tabelle pivot dinamiche in MySQL, puoi utilizzare uno strumento di reporting per tracciarlo in una tabella. Ecco un esempio di tabella pivot creata utilizzando Ubiq.

Sapevi che puoi creare tabelle pivot dinamiche in Ubiq senza scrivere SQL?

A proposito, se vuoi creare tabelle pivot, grafici e dashboard dal database MySQL, puoi provare Ubiq. Offriamo una prova gratuita di 14 giorni.