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.