Ciò di cui hai bisogno è una query Pivot. Poiché MySQL non ha un'istruzione per questo, dovrai scriverla "a mano" (più esattamente, creare un'espressione SQL dinamica):
Quindi, potrebbe essere qualcosa del genere:
-- 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;
Per favore vedi questo esempio in SQL fiddle .
La spiegazione
Potresti dire "amico, sembra piuttosto complesso!"... ma non è affatto complesso (è solo laborioso). Quindi, come funziona la soluzione di cui sopra?
Il primo passo è costruire l'elenco delle colonne e un'espressione per riempirlo. Il group_concat()
funzione prenderà i valori di riga (o espressioni) e li concatenerà, separandoli da virgole. È necessaria una funzione di aggregazione per mostrare i valori nel risultato della tabella pivot. Ho scelto max()
come esempio, ma puoi usare sum()
, average()
o qualsiasi altra funzione aggregata.
Per quanto riguarda il case ... end
pezzo all'interno della funzione di aggregazione, è necessario che ogni colonna della tabella pivot corrisponda al valore di del_productID
, quindi, ad esempio, case when del_ProductID = 1 then del_id end
restituirà il valore di del_id
solo se del_ProductID
è 1 (restituirà null
in ogni altro caso, puoi aggiungere else 0
se vuoi restituire zero, ad esempio).
Il select ... into
memorizzerà il risultato dell'espressione in una variabile chiamata @sql
.
Dopo aver creato l'elenco delle colonne, devi scrivere il resto del select
istruzione... questo è fatto con concat()
funzione.
Per il resto, è abbastanza semplice:@sql
è una stringa, quindi se vuoi eseguirla, devi creare un'istruzione preparata usando il suo valore (che è un select
istruzione) ed eseguirlo.