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 |
+-------+----------+----------+----------+