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

consulta de diseño horizontal de datos mysql

Lo que necesita es una consulta Pivot. Dado que MySQL no tiene una declaración para eso, deberá escribirla "a mano" (más exactamente, cree una expresión SQL dinámica):

Entonces, puede ser algo como esto:

-- First you need to build the column list.
-- The "CASE ... END" expression will filter the data for each column
-- I use "max()" as an example; use whatever aggregate function you need.
select
  group_concat(distinct
    concat(
      'max(case when del_ProductID = ', del_productID, ' then del_id end) ',
      'as `del_productID-', del_productID, '` '
    )
  )
into @sql
from example;

-- Now build the full SELECT statement
set @sql = concat('SELECT del_date, ', @sql, ' from example group by del_date');


-- OPTIONAL: Check the SELECT statement you've just built
select @sql;

-- Prepare a statement using the SELECT statement built above
prepare stmt from @sql;
execute stmt;

-- When you are done, be sure to dealocate the prepared statement
deallocate prepare stmt;

vea este ejemplo en SQL fiddle .

La explicación

Puedes decir "amigo, ¡esto parece bastante complejo!"... pero no es nada complejo (solo es laborioso). Entonces, ¿cómo funciona la solución anterior?

El primer paso es construir la lista de columnas y una expresión para llenarla. El group_concat() La función tomará valores de fila (o expresiones) y los concatenará, separándolos por comas. Necesita una función agregada para mostrar los valores en el resultado de la tabla dinámica. Elegí max() como ejemplo, pero puedes usar sum() , average() o cualquier otra función agregada.

En cuanto al caso case ... end pieza dentro de la función agregada, necesita que cada columna de la tabla dinámica coincida con el valor de del_productID , entonces, por ejemplo, case when del_ProductID = 1 then del_id end devolverá el valor de del_id solo si del_ProductID es 1 (devolverá null en cualquier otro caso, puede agregar else 0 si desea devolver cero, por ejemplo).

El select ... into almacenará el resultado de la expresión en una variable llamada @sql .

Una vez que haya creado la lista de columnas, debe escribir el resto de select declaración... eso se hace con el concat() función.

En cuanto al resto, es bastante sencillo:@sql es una cadena, por lo que si desea ejecutarla, debe crear una declaración preparada usando su valor (que es un select sentencia) y ejecútelo.