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

Cómo transponer filas a columnas dinámicamente en MySQL

A veces, sus datos pueden almacenarse en filas y es posible que desee informarlos como columnas. En tales casos, deberá transponer filas en columnas. A veces, incluso estas filas pueden ser variables. Entonces puede saber cuántas columnas necesita. En tales casos, debe transponer filas a columnas dinámicamente. Dado que no hay una función integrada para hacer eso en MySQL, debe lograrlo mediante una consulta SQL. Aquí hay una consulta SQL para transponer dinámicamente filas a columnas en MySQL.

Cómo transponer filas a columnas dinámicamente en MySQL

Aquí se explica cómo crear tablas dinámicas dinámicas 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    |
+------------+-------------+-------------+-------------+

Transponer filas a columnas dinámicamente

Si ya sabe qué columnas crearía de antemano, simplemente puede usar una instrucción CASE para crear una tabla dinámica.

Como no sabemos qué columnas se crearán, tendremos que transponer dinámicamente filas a columnas 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, según 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   |
+------------+------------+-----------+------------+

Así es como puede automatizar consultas de tablas dinámicas en MySQL y transponer filas a columnas dinámicamente.

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 instrucció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 transpone filas a columnas dinámicamente en MySQL.

Este es un ejemplo de una tabla dinámica creada con Ubiq.

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