TABLAS DINÁMICAS EN MYSQL: CÓMO TRABAJAR CON ELLAS

Las tablas dinámicas en bases de datos, son una técnica que permite resumir, analizar y reorganizar datos de una tabla de manera dinámica para facilitar su interpretación. En el contexto de bases de datos, se utilizan para transformar datos almacenados en un formato relacional (filas y columnas) en una vista más compacta y significativa, generalmente para análisis o reportes. Convierte datos de un formato largo (muchas filas con valores repetidos) a un formato ancho (agrupando y resumiendo información). Permite realizar cálculos como sumas, promedios, conteos, etc., sobre los datos. Los usuarios pueden reorganizar las filas, columnas y valores según sus necesidades, cambiando la perspectiva del análisis. Se usan en herramientas como hojas de cálculo o sistemas de bases de datos para generar informes.
Se usan para Análisis de datos, resumir grandes volúmenes de datos para identificar patrones o tendencias, reportes como crear vistas personalizadas para presentaciones o informe y toma de decisiones para facilitar la comparación de datos en diferentes dimensiones (por ejemplo, ventas por región, producto o tiempo)..
Las tablas dinámicas en MySQL no son una funcionalidad nativa como en algunos software de hojas de cálculo o en lenguajes. Sin embargo, se pueden crear tablas dinámicas en MySQL utilizando consultas SQL con funciones de agregación (SUM, COUNT, AVG, etc.) y técnicas como GROUP BY, CASE o IF. A continuación, se explica cómo crear una tabla dinámica en MySQL. Una tabla dinámica reorganiza datos de filas a columnas, generalmente para resumir información. Por ejemplo, si existe una tabla con ventas por producto y mes, se puede crear una tabla dinámica que muestre los productos como filas y los meses como columnas, con los valores de ventas agregados.

Pasos para crear una tabla dinámica en MySQL

  1. Identificar los datos:
    • Filas: Qué columna será la base de las filas (e.g., productos).
    • Columnas: Qué columna se convertirá en las nuevas columnas (e.g., meses).
    • Valores: Qué datos se agregarán (e.g., suma de ventas).
    • Condición de agregación: Qué función usar (e.g., SUM, COUNT, AVG).
  2. Usar CASE o IF: MySQL no tiene una función PIVOT como otros sistemas (e.g., SQL Server). En su lugar, usar CASE o IF para crear columnas dinámicamente basadas en los valores de una columna.
  3. Agrupa los datos: Usar GROUP BY para agrupar por la columna que formará las filas. Si los valores de las columnas (e.g., meses) no son fijos, se pueden usar consultas preparadas (PREPARE, EXECUTE) para generar la consulta dinámicamente. Supongamos que existe una tabla ventas con la siguiente estructura:

    CREATE TABLE ventas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    producto VARCHAR(50),
    mes VARCHAR(20),
    cantidad INT
    );
    
    INSERT INTO ventas (producto, mes, cantidad) VALUES
    ('Laptop', 'Enero', 10),
    ('Laptop', 'Febrero', 15),
    ('Laptop', 'Marzo', 20),
    ('Teléfono', 'Enero', 5),
    ('Teléfono', 'Febrero', 8),
    ('Teléfono', 'Marzo', 12);
    
    Se quiere crear una tabla dinámica que muestre:
    • Filas: Productos.
    • Columnas: Meses (Enero, Febrero, Marzo).
    • Valores: Suma de cantidad,
  4. Opcional: Generación dinámica. Si los valores de las columnas (e.g., meses) no son fijos, puedes usar consultas preparadas (PREPARE, EXECUTE) para generar la consulta dinámicamente.

Ejemplo práctico: Tabla de ventas

Suponiendo que existe una tabla ventas con la siguiente estructura:

CREATE TABLE ventas (
id INT AUTO_INCREMENT PRIMARY KEY,
producto VARCHAR(50),
mes VARCHAR(20),
cantidad INT
);

INSERT INTO ventas (producto, mes, cantidad) VALUES
('Laptop', 'Enero', 10),
('Laptop', 'Febrero', 15),
('Laptop', 'Marzo', 20),
('Teléfono', 'Enero', 5),
('Teléfono', 'Febrero', 8),
('Teléfono', 'Marzo', 12);
Se quiere crear una tabla dinámica que muestre:
  • Filas: Productos.
  • Columnas: Meses (Enero, Febrero, Marzo).
  • Valores: Suma de cantidad.
SELECT 
producto,
SUM(CASE WHEN mes = 'Enero' THEN cantidad ELSE 0 END) AS Enero,
SUM(CASE WHEN mes = 'Febrero' THEN cantidad ELSE 0 END) AS Febrero,
SUM(CASE WHEN mes = 'Marzo' THEN cantidad ELSE 0 END) AS Marzo
FROM ventas
GROUP BY producto;
  • En el ejemplo anterior CASE WHEN mes = 'Enero' THEN cantidad ELSE 0 END: Asigna la cantidad si el mes es Enero, de lo contrario 0.
  • SUM() agrega los valores para cada producto y mes.
  • GROUP BY producto agrupa los resultados por producto.

Consulta dinámica (si las columnas no son fijas)

Si los valores de la columna mes no son conocidos de antemano o cambian con el tiempo, puedes generar la consulta dinámicamente usando una consulta preparada.

SET @sql = NULL;

SELECT 
GROUP_CONCAT(DISTINCT
CONCAT(
  'SUM(CASE WHEN mes = ''',
  mes,
  ''' THEN cantidad ELSE 0 END) AS `',
  mes,
  '`'
)
) INTO @sql
FROM ventas;

SET @sql = CONCAT('SELECT producto, ', @sql, ' FROM ventas GROUP BY producto');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;