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.