Wat je nodig hebt is een Pivot-query. Aangezien MySQL daar geen statement voor heeft, moet je het "met de hand" schrijven (meer precies, maak een dynamische SQL-expressie):
Het kan dus zoiets zijn:
-- 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;
bekijk dit voorbeeld in SQL fiddle .
De uitleg
Je zou kunnen zeggen "kerel, dit ziet er behoorlijk ingewikkeld uit!"... maar het is helemaal niet ingewikkeld (het is gewoon omslachtig). Dus, hoe werkt de bovenstaande oplossing?
De eerste stap is het samenstellen van de kolomlijst en een expressie om deze te vullen. De group_concat() functie neemt rijwaarden (of uitdrukkingen) en voegt ze samen, gescheiden door komma's. U hebt een aggregatiefunctie nodig om de waarden in het resultaat van de draaitabel weer te geven. Ik koos max() als voorbeeld, maar u kunt sum() . gebruiken , average() of een andere verzamelfunctie.
Wat betreft de case ... end
stuk binnen de aggregatiefunctie, moet u dat elke kolom van de draaitabel overeenkomt met de waarde van del_productID , dus bijvoorbeeld case when del_ProductID = 1 then del_id end retourneert de waarde van del_id alleen als del_ProductID is 1 (retourneert null in elk ander geval kunt u else 0 . toevoegen als u bijvoorbeeld nul wilt retourneren).
De select ... into
slaat het resultaat van de expressie op in een variabele genaamd @sql .
Nadat je de kolomlijst hebt gemaakt, moet je de rest van de select . schrijven statement... dat wordt gedaan met de concat() functie.
Voor de rest is het vrij eenvoudig:@sql is een tekenreeks, dus als u deze wilt uitvoeren, moet u een voorbereide instructie maken met de waarde ervan (wat een select is statement) en voer het uit.