Was Sie brauchen, ist eine Pivot-Abfrage. Da MySQL dafür keine Anweisung hat, müssen Sie sie "von Hand" schreiben (genauer gesagt, erstellen Sie einen dynamischen SQL-Ausdruck):
Es könnte also so aussehen:
-- 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;
Bitte sehen Sie sich dieses Beispiel in SQL fiddle an .
Die Erklärung
Sie können sagen "Alter, das sieht ziemlich komplex aus!" ... aber es ist überhaupt nicht komplex (es ist nur mühsam). Also, wie funktioniert die obige Lösung?
Der erste Schritt besteht darin, die Spaltenliste und einen Ausdruck zum Füllen zu erstellen. Der group_concat()
Die Funktion nimmt Zeilenwerte (oder Ausdrücke) und verkettet sie, wobei sie durch Kommas getrennt werden. Sie benötigen eine Aggregatfunktion, um die Werte im Ergebnis der Pivot-Tabelle anzuzeigen. Ich habe max()
gewählt als Beispiel, aber Sie können sum()
verwenden , average()
oder jede andere Aggregatfunktion.
Wie für den case ... end
Teil innerhalb der Aggregatfunktion, muss jede Spalte der Pivot-Tabelle mit dem Wert von del_productID
übereinstimmen , also zum Beispiel case when del_ProductID = 1 then del_id end
gibt den Wert von del_id
zurück nur wenn del_ProductID
ist 1 (gibt null
zurück in allen anderen Fällen können Sie else 0
hinzufügen wenn Sie zum Beispiel Null zurückgeben möchten).
Der select ... into
speichert das Ergebnis des Ausdrucks in einer Variablen namens @sql
.
Nachdem Sie die Spaltenliste erstellt haben, müssen Sie den Rest des select
schreiben Anweisung... das geht mit concat()
Funktion.
Der Rest ist ziemlich einfach:@sql
ist eine Zeichenfolge, wenn Sie sie also ausführen möchten, müssen Sie eine vorbereitete Anweisung erstellen, die ihren Wert verwendet (was ein select
ist -Anweisung), und führen Sie sie aus.