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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+-------+----------+----------+----------+
| 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 |
+-------+----------+----------+----------+