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

Come trasporre righe in colonne in modo dinamico in MySQL

A volte, i tuoi dati potrebbero essere archiviati in righe e potresti voler segnalarli come colonne. In questi casi, dovrai trasporre le righe in colonne. A volte, anche queste righe possono essere variabili. Quindi potresti sapere di quante colonne hai bisogno. In questi casi, è necessario trasporre le righe in colonne in modo dinamico. Poiché non esiste una funzione integrata per farlo in MySQL, è necessario eseguirlo utilizzando una query SQL. Ecco una query SQL per trasporre dinamicamente le righe in colonne in MySQL.

Come trasporre righe in colonne in modo dinamico in MySQL

Ecco come creare tabelle pivot dinamiche in MySQL. 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 di voler trasporre le righe in colonne in modo dinamico, 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    |
+------------+-------------+-------------+-------------+

Trasponi le righe in colonne in modo dinamico

Se sai già quali colonne creerai in anticipo, puoi semplicemente utilizzare un'istruzione CASE per creare una tabella pivot.

Poiché non sappiamo quali colonne creare, dovremo trasporre dinamicamente le righe in colonne utilizzando la funzione GROUP_CONCAT, 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 field_key da più righe in un'unica stringa. Nella query precedente, utilizziamo GROUP_CONCAT per creare dinamicamente istruzioni CASE, basate sui valori univoci in field_key colonna e memorizza quella stringa nella variabile @sql, che viene quindi utilizzata per creare la nostra query di selezione.

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

Ecco come puoi automatizzare le query della tabella pivot in MySQL e trasporre le righe in colonne in modo dinamico.

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

Se vuoi trasporre solo i valori di riga selezionati come colonne, puoi aggiungere la clausola WHERE nella tua prima istruzione GROUP_CONCAT select.

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 nella tua istruzione SET.

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 trasponi le righe in colonne in modo dinamico in MySQL.

Ecco un esempio di tabella pivot creata utilizzando Ubiq.

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