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

Cómo deshacer la tabla pivotante en MySQL

A veces es necesario transponer columnas en filas o deshacer la tabla pivotante en MySQL. Dado que MySQL no tiene una función para UNPIVOT o REVERSE PIVOT una tabla, debe escribir una consulta SQL para transponer columnas en filas. Aquí se explica cómo deshacer la tabla pivotante en MySQL.

Cómo quitar el pivote de una tabla en MySQL

Supongamos que tiene la siguiente tabla dinámica

mysql>create table data(id int, a varchar(255), b varchar(255), c varchar(255));
mysql>insert into data(id,a,b,c) values(1,'a1','b1','c1'),(2,'a1','b1','c1');
mysql>select * from data;

+------+------+------+------+
| id   | a    | b    | c    |
+------+------+------+------+
|    1 | a1   | b1   | c1   |
|    2 | a1   | b1   | c1   |
+------+------+------+------+

Digamos que desea deshacer la tabla pivotante en MySQL a lo siguiente.

1 | a1 | a
1 | b1 | b
1 | c1 | c
2 | a2 | a
2 | b2 | b
2 | c2 | c

Lectura adicional: Cómo crear tablas dinámicas dinámicas en MySQL

Anular tabla dinámica en MySQL

Aquí está la consulta para hacer unpivot en SQL. Dado que MySQL no ofrece una función UNPIVOT, debe usar la cláusula UNION ALL para revertir el pivote de una tabla en MySQL.

mysql> select id, 'a' col, a value
      from data
      union all
      select id, 'b' col, b value
      from data
      union all
      select id, 'c' col, c value
      from data;
+------+-----+-------+
| id   | col | value |
+------+-----+-------+
|    1 | a   | a1    |
|    2 | a   | a1    |
|    1 | b   | b1    |
|    2 | b   | b1    |
|    1 | c   | c1    |
|    2 | c   | c1    |
+------+-----+-------+

En la consulta anterior, básicamente cortamos la tabla original en 3 más pequeñas, una para cada columna a, b, c y luego las agregamos una debajo de la otra usando UNION ALL.

Si desea filtrar filas, puede agregar una cláusula WHERE como se muestra a continuación

mysql> select id, 'a' col, a value
      from data
      WHERE condition
      union all
      select id, 'b' col, b value
      from data
      WHERE condition
      union all
      select id, 'c' col, c value
      from data
      WHERE condition;

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

Desafortunadamente, es tedioso, pero es una de las dos únicas formas de descentrar en MySQL. El otro implica hacer una unión cruzada, como se muestra a continuación.

mysql> select t.id,
       c.col,
       case c.col
         when 'a' then a
         when 'b' then b
         when 'c' then c
       end as data
     from data t
     cross join
     (
       select 'a' as col
       union all select 'b'
       union all select 'c'
     ) c;
+------+-----+------+
| id   | col | data |
+------+-----+------+
|    1 | a   | a1   |
|    2 | a   | a1   |
|    1 | b   | b1   |
|    2 | b   | b1   |
|    1 | c   | c1   |
|    2 | c   | c1   |
+------+-----+------+

Lectura adicional:Cómo automatizar consultas de tablas dinámicas en MySQL

Puede personalizar la consulta anterior para quitar el pivote de la tabla en MySQL, utilizando la cláusula WHERE. También puede usar una herramienta de informes para trazar el resultado en una tabla. Este es un ejemplo de una tabla 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.