O que você precisa é de uma consulta Pivot. Como o MySQL não possui uma instrução para isso, você precisará escrevê-la "à mão" (mais exatamente, crie uma expressão SQL dinâmica):
Então, pode ser algo assim:
-- 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;
Por favor, veja este exemplo no violino SQL .
A explicação
Você pode dizer "cara, isso parece bastante complexo!"... mas não é nada complexo (é apenas trabalhoso). Então, como funciona a solução acima?
O primeiro passo é construir a lista de colunas e uma expressão para preenchê-la. O
group_concat()
A função pegará valores de linha (ou expressões) e os concatenará, separando-os por vírgulas. Você precisa de uma função agregada para mostrar os valores no resultado da tabela dinâmica. Eu escolhi max()
como exemplo, mas você pode usar sum()
, average()
ou qualquer outra função agregada. Quanto ao caso
case ... end
peça dentro da função agregada, você precisa que cada coluna da tabela dinâmica corresponda ao valor de del_productID
, então, por exemplo, case when del_ProductID = 1 then del_id end
retornará o valor de del_id
somente se del_ProductID
é 1 (retornará null
em qualquer outro caso, você pode adicionar else 0
se você quiser retornar zero, por exemplo). O
select ... into
irá armazenar o resultado da expressão em uma variável chamada @sql
. Depois de criar a lista de colunas, você precisa escrever o restante do
select
declaração... isso é feito com o concat()
função. Quanto ao resto, é bastante simples:
@sql
é uma string, então se você quiser executá-la, você precisa criar uma instrução preparada usando seu valor (que é um select
instrução) e executá-lo.