Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abfrage für horizontales Layout von MySQL-Daten

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.