Det du har brug for er en Pivot-forespørgsel. Da MySQL ikke har en erklæring til det, bliver du nødt til at skrive den "i hånden" (mere præcist, opret et dynamisk SQL-udtryk):
Så det kan være noget som dette:
-- 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;
se dette eksempel i SQL violin .
Forklaringen
Du kan sige "fyr, det her ser ret komplekst ud!"... men det er slet ikke komplekst (det er bare besværligt). Så hvordan virker ovenstående løsning?
Det første trin er at bygge kolonnelisten og et udtryk til at udfylde den. group_concat()
funktion vil tage rækkeværdier (eller udtryk) og sammenkæde dem, adskille dem med kommaer. Du skal bruge en aggregeret funktion for at vise værdierne i resultatet af pivottabellen. Jeg valgte max()
som et eksempel, men du kan bruge sum()
, average()
eller enhver anden samlet funktion.
Med hensyn til case ... end
stykke inde i den samlede funktion, skal du have, at hver kolonne i pivottabellen matcher værdien af del_productID
, så f.eks. case when del_ProductID = 1 then del_id end
returnerer værdien af del_id
kun hvis del_ProductID
er 1 (vil returnere null
i alle andre tilfælde kan du tilføje else 0
hvis du for eksempel vil returnere nul).
select ... into
vil gemme resultatet af udtrykket i en variabel kaldet @sql
.
Når du har bygget kolonnelisten, skal du skrive resten af select
sætning... det er gjort med concat()
funktion.
Hvad angår resten, er det ret ligetil:@sql
er en streng, så hvis du vil udføre den, skal du oprette en forberedt sætning ved hjælp af dens værdi (som er en select
sætning), og udfør den.