Ein mehrspaltiges Ergebnis aus einer Spalte generieren (MySQL)
Das Problem:
Eine Datenbank, in der die Daten alle 5 Minuten mit Datum/Zeit gespeichert werden. Die Daten sollen in einem SQL-Ergebnis so dargestellt werden, dass von allen bis jetzt vorhandenen Jahren eine Spalte erzeugt wird um (aufsummierte) Monatswerte vergleichen zu können.
Die Lösung:
SELECT * FROM
(
SELECT
Extract(month from `date`) as monat,
max(`E-Total`) - min(`E-Total`) as diff2009
FROM
archiv
WHERE
Extract(year from `date`) = 2009
GROUP BY monat
ORDER BY monat
) as t2009
NATURAL LEFT JOIN
(
SELECT
Extract(month from `date`) as monat,
max(`E-Total`) - min(`E-Total`) as diff2010
FROM
archiv
WHERE
Extract(year from `date`) = 2010
GROUP BY monat
ORDER BY monat
) as t2010
NATURAL LEFT JOIN
(
SELECT
Extract(month from `date`) as monat,
max(`E-Total`) - min(`E-Total`) as diff2011
FROM
archiv
WHERE
Extract(year from `date`) = 2011
GROUP BY monat
ORDER BY monat
) as t2011
Das Ergebnis:
+-------+----------+----------+----------+
| monat | diff2009 | diff2010 | diff2011 |
+-------+----------+----------+----------+
| 1 | 180.00 | 23.66 | 2.27 |
| 2 | 136.00 | 146.99 | NULL |
| 3 | 279.00 | 355.02 | NULL |
| 4 | 475.00 | 476.27 | NULL |
| 5 | 477.00 | 309.44 | NULL |
| 6 | 389.48 | 522.26 | NULL |
| 7 | 478.42 | 519.05 | NULL |
| 8 | 510.60 | 365.10 | NULL |
| 9 | 342.67 | 340.95 | NULL |
| 10 | 203.37 | 313.64 | NULL |
| 11 | 130.66 | 73.19 | NULL |
| 12 | 94.42 | 6.50 | NULL |
+-------+----------+----------+----------+