sql >> Base de Datos >  >> RDS >> Mysql

Cómo mostrar valores de fila como columnas en MySQL

A veces, es posible que deba transponer filas en columnas o crear tablas dinámicas para generar informes. Dado que no hay una función integrada para lograr el pivote en MySQL, debe lograrlo a través de una consulta SQL para crear una tabla de informe dinámico. Veamos cómo mostrar valores de fila como columnas en MySQL.

Cómo mostrar valores de fila como columnas en MySQL

Digamos que tienes la siguiente tabla.

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

Supongamos que desea transponer filas a columnas dinámicamente, de modo que se crea una nueva columna para cada valor único en field_key columna, es decir (nombre, apellido, ocupación)

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

Mostrar valores de fila como columnas en MySQL

Si ya sabe qué columnas desea crear, puede crear una tabla dinámica utilizando instrucciones CASE, como se muestra a continuación, para mostrar los valores de las filas como columnas en 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   |
+------------+------------+-----------+------------+

Mostrar valores de fila como columnas en MySQL dinámicamente

Si no conoce los nombres de las columnas de antemano, o desea mostrar los valores de las filas como columnas en MySQL dinámicamente, puede crear tablas dinámicas en MySQL usando la función GROUP_CONCAT, como se muestra a continuación.

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 le permite concatenar valores field_key de varias filas en una sola cadena. En la consulta anterior, usamos GROUP_CONCAT para crear declaraciones CASE dinámicamente, en función de los valores únicos en field_key y almacene esa cadena en la variable @sql, que luego se usa para crear nuestra consulta de selección.

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

Puede personalizar la consulta anterior según sus requisitos agregando la cláusula WHERE o JOINS.

Si desea transponer solo valores de fila seleccionados como columnas, puede agregar la cláusula WHERE en su primera declaración GROUP_CONCAT de selección.

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

Si desea filtrar filas en su tabla dinámica final, puede agregar la cláusula WHERE en su instrucción SET.

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

Del mismo modo, también puede aplicar JOINS en su consulta SQL mientras muestra los valores de las filas como columnas en MySQL.

Después de convertir una fila en una columna en MySQL, puede usar una herramienta de gráficos para trazar el resultado en una tabla. Este es un ejemplo de una tabla dinámica creada con Ubiq.

Si desea crear tablas dinámicas, gráficos y paneles desde la base de datos MySQL, puede probar Ubiq. Ofrecemos una prueba gratuita de 14 días.