Rolf B: Summe über die letzten 7 Tage, gruppiert nach Datum

Beitrag lesen

Hallo franz_hoff,

gut. Dann brauchst Du eine Art "Listengenerator", wenn Du das mit SQL machen willst. Das geht bspw. über ein UNION Statement, oder klassisch über eine Temp-Table mit einer INT-Spalte, die die Werte von 0-6 enthält.

Dein Beispiel wirft übrigens eine neue Frage auf. Du hast am Dienstag 5 Aufträge bekommen, einen Auftrag abgearbeitet und die Anzahl steigt um 4. Was heißt das denn für die Zahl "430" vom Sonntag? Sind das alles offene Aufträge, die noch abzuarbeiten sind?

Daher nun die Frage nach den technischen Rahmenbedingungen

  • welche Version von MYSQL verwendest Du?
  • bist Du darauf angewiesen, diese Abfrage in reinem SQL zu machen? Wovon wird das Ergebnis der Abfrage weiterverarbeitet? Ein Programm, ein Reporting-Tool, oder keine weitere Verarbeitung?
  • kannst Du eine Routine erstellen (Stored Procedure)?
  • kannst Du Variablen nutzen?

Der Generator für eine Datumsliste sähe mit einer Variablen und einem UNION so aus:

SET @anfang = SUBDATE(CURDATE(), WEEKDAY(CURDAT()));

SELECT @anfang as Datum
UNION SELECT ADDDATE(@anfang, 1)
UNION SELECT ADDDATE(@anfang, 2)
UNION SELECT ADDDATE(@anfang, 3)
UNION SELECT ADDDATE(@anfang, 4)
UNION SELECT ADDDATE(@anfang, 5)
UNION SELECT ADDDATE(@anfang, 6)

Sowas kann man dann als Treiber für einen Subselect-Query verwenden:

SET @anfang = SUBDATE(CURDATE(), WEEKDAY(CURDAT()));

SELECT Datum, (SELECT COUNT(*) from auftraege a WHERE a.Datum <= t.Datum) as Anzahl
FROM (SELECT @anfang as Datum
      UNION SELECT ADDDATE(@anfang, 1)
      UNION SELECT ADDDATE(@anfang, 2)
      UNION SELECT ADDDATE(@anfang, 3)
      UNION SELECT ADDDATE(@anfang, 4)
      UNION SELECT ADDDATE(@anfang, 5)
      UNION SELECT ADDDATE(@anfang, 6)) t
WHERE t.Datum <= CURDATE()

Ohne die @anfang Variable müsstest Du überall da, wo @anfang steht, den SUBDATE-Ausdruck hinkopieren. Darum die Frage ob Du Variablen oder Routinen verwenden kannst.

Eine Query dieser Art hat aber immense Nachteile. Sie läuft pro Tag über den größten Teil der Auftragstabelle und summiert immer wieder neu auf. Deine Datenbank wird darüber nicht happy sein. Man kann diesen Rubbeln über die gesamte Tabelle optimieren, indem man alle Aufträge vor dem Startdatum einmal zählt und dann nur noch die Woche betrachtet:

SET @anfang = SUBDATE(CURDATE(), WEEKDAY(CURDAT()));
set @basis = (select count(*) from auftraege where datum < @anfang);

SELECT Datum, @basis+(SELECT COUNT(*) from auftraege a 
               WHERE a.Datum BETWEEN @anfang AND t.Datum) as Anzahl
FROM (SELECT @anfang as Datum
      UNION SELECT ADDDATE(@anfang, 1)
      UNION SELECT ADDDATE(@anfang, 2)
      UNION SELECT ADDDATE(@anfang, 3)
      UNION SELECT ADDDATE(@anfang, 4)
      UNION SELECT ADDDATE(@anfang, 5)
      UNION SELECT ADDDATE(@anfang, 6)) t
WHERE t.Datum <= CURDATE()

Ob so etwas geht, hängt von der Umgebung ab, in der Du das ausführst.

Rolf

--
sumpsi - posui - clusi