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

Come visualizzare i valori di riga come colonne in MySQL

A volte, potrebbe essere necessario trasporre le righe in colonne o creare tabelle pivot ai fini dei rapporti. Poiché non esiste una funzione integrata per ottenere il pivot in MySQL, è necessario eseguirlo tramite query SQL per creare una tabella di report pivot. Vediamo come visualizzare i valori delle righe come colonne in MySQL.

Come visualizzare i valori delle righe come colonne 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    |
+------------+-------------+-------------+-------------+

Visualizza i valori delle righe come colonne in MySQL

Se sai già quali colonne desideri creare, puoi creare una tabella pivot utilizzando le istruzioni CASE, come mostrato di seguito, per visualizzare i valori delle righe come colonne in MySQL.

mysql> select meeting_Id,
         max(case when (field_key='first_name') then field_value else NULL end) as 'first_name',
         max(case when (field_key='last_name') then field_value else NULL end) as 'last_name',
         max(case when (field_key='occupation') then field_value else NULL end) as 'occupation'
         from meeting
         group by meeting_Id
         order by meeting_Id;
+------------+------------+-----------+------------+
| meeting_Id | first_name | last_name | occupation |
+------------+------------+-----------+------------+
|          1 | Alec       | Jones     | engineer   |
|          2 | John       | Doe       | engineer   |
+------------+------------+-----------+------------+

Visualizza i valori delle righe come colonne in MySQL in modo dinamico

Se non conosci i nomi delle colonne in anticipo o desideri visualizzare i valori delle righe come colonne in MySQL in modo dinamico, puoi creare tabelle pivot dinamiche in MySQL 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   |
+------------+------------+-----------+------------+

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 visualizzi i valori delle righe come colonne in MySQL.

Dopo aver convertito una riga in una colonna in MySQL, puoi utilizzare uno strumento di creazione di grafici per tracciare il risultato in una tabella. Ecco un esempio di una tabella pivot creata utilizzando Ubiq.

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