Robert R.: MySQL, Gruppieren und summieren über mehrere Stufen

Beitrag lesen

Liebe Mitdenker,
liebe Wissende,
liebe Neugierige,

ja!

Und noch eins drauf für die nächste Stufe...

Ich poste daher meine Lösung (sie ist eigentlich nur Deine, übersetzt auf meine Tabellenstruktur...) nochmal. Sie benutzt im Unterschied zu Klaus' Lösung eine Datetime-Spalte.

--Tabelle:
CREATE TABLE IF NOT EXISTS inno_gruppieren (
id INT(11) NOT NULL AUTO_INCREMENT,
datum DATETIME NOT NULL,
wert INT(11) NOT NULL,
PRIMARY KEY (id)
)
COMMENT='Übungen zum Filtern, Gruppieren, Summieren etc'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
CHECKSUM=1
AUTO_INCREMENT=1;

--Query:
select concat(year(tageswerte.datum),'-',month(tageswerte.datum)) as monat,
    sum(maxwert) as  monatssumme
from (select datum, date(t1.datum) as tag, max(wert) as maxwert
from inno_gruppieren t1 group by tag) as tageswerte group by monat;


>   
> Musterdaten:  
>   
> ~~~text
  

> id;datum;wert  
> 1;2014-01-09 10:51:24;10  
> 2;2014-01-09 10:52:23;15  
> 3;2014-01-09 10:54:59;9  
> 4;2014-02-09 11:00:54;0  
> 5;2014-02-01 11:01:11;1  
> 6;2014-02-01 10:30:00;5  
> 7;2014-02-02 11:03:14;33  
> 8;2014-02-07 11:03:47;20  
> 9;2014-02-07 11:04:08;12  
> 10;2014-02-07 11:04:32;17  
> 11;2014-01-07 11:04:54;2  
> 12;2014-02-07 11:05:16;45  
> 13;2014-02-08 11:05:34;3  
> 14;2014-04-17 11:05:54;22  
> 15;2014-04-17 11:06:19;80  
> 16;2014-01-17 11:06:42;1  
> 17;2014-04-09 11:07:02;13  
> 18;2014-05-01 11:07:31;22  
> 19;2014-05-22 21:07:50;44  
> 20;2014-05-01 11:08:14;7  
> 21;2014-05-22 11:08:35;13  
> 22;2014-05-01 11:08:59;88  
>   
> 

Ergebnis:

"monat";"monatssumme"
"2014-1";"18"
"2014-2";"86"
"2014-4";"93"
"2014-5";"132"


>   
>   
> Was hier besser deutlich wird ist, dass man im äußeren select den Temporärbezeichner der Unterabfrage benutzen muss, wenn man keine Fehlermeldung kassieren will:  
>   
> ~~~sql
  

> /* SQL Fehler (1054): Unknown column 'datum' in 'field list' */  
>   
> 

  
select sum(liste.monatssumme) as totalamount  
from (select concat(year(tageswerte.datum),'-',month(tageswerte.datum)) as monat,  
    sum(maxwert) as monatssumme  
    from (select datum, date(t1.datum) as tag, max(wert) as maxwert  
	from inno_gruppieren t1 group by tag) as tageswerte group by monat) as liste;  
  

So langsam macht das spaß ;-)

Wie weit kann man das Spiel wohl treiben?
Irgendwann wird wohl der DB-Server stehenbleiben?

Spirituelle Grüße

Euer Robert

--
Möge der Forumsgeist wiederbelebt werden!