Vad du behöver är en Pivot-fråga. Eftersom MySQL inte har ett uttalande för det, måste du skriva det "för hand" (mer exakt, skapa ett dynamiskt SQL-uttryck):
Så det kan vara ungefär så här:
-- 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;
Vänligen se det här exemplet i SQL-fiol .
Förklaringen
Du kanske säger "dude, det här ser ganska komplicerat ut!"... men det är inte alls komplicerat (det är bara jobbigt). Så, hur fungerar ovanstående lösning?
Det första steget är att bygga kolumnlistan och ett uttryck för att fylla den. group_concat()
funktion kommer att ta radvärden (eller uttryck) och sammanfoga dem, separera dem med kommatecken. Du behöver en aggregatfunktion för att visa värdena i resultatet av pivottabellen. Jag valde max()
som ett exempel, men du kan använda sum()
, average()
eller någon annan aggregatfunktion.
När det gäller case ... end
del inuti aggregatfunktionen behöver du att varje kolumn i pivottabellen matchar värdet på del_productID
, så till exempel case when del_ProductID = 1 then del_id end
returnerar värdet för del_id
endast om del_ProductID
är 1 (kommer att returnera null
i alla andra fall kan du lägga till else 0
om du till exempel vill returnera noll).
select ... into
kommer att lagra resultatet av uttrycket i en variabel som heter @sql
.
När du har skapat kolumnlistan måste du skriva resten av select
uttalande... som görs med concat()
funktion.
Vad gäller resten är det ganska okomplicerat:@sql
är en sträng, så om du vill köra den måste du skapa en förberedd sats med dess värde (som är en select
uttalande), och kör den.