ich habe eine ewig lange abfrage zusammengebaut und bin nun auf der suche nach einem kürzeren Ansatz (so es sie gibt).
Die Tabelle beinhaltet neben anderen folgende 5 Relevante Spalten
Datum | Auftrag | Taetigkeit | Arbeit | Vorbereitung
So werden die Arbeitszeiten gespeichert.
die 114 ist z.B. CNC Bearbeitung und 240 min bzw. 45 min.
2017-02-25 | 1758458 | 114 | 240 | 45
Nun frage ich in der Tabelle alle Aufträge des Monats ab
SELECT Auftrag
FROM sql_tabelle
WHERE Datum >= ‚2017-02-01‘
AND Datum <= ‚2017-02-28‘
GROUP BY Auftrag;
Sowie alle Tätigkeiten
SELECT Taetigkeit
FROM sql_tabelle
WHERE Datum >= ‚2017-02-01‘
AND Datum <= ‚2017-02-28‘
GROUP BY Taetigkeit;
Mittels PHP Schleife
erstelle ich nun eine Abfrage welche mir für jeden Auftrag alle summen der Zeiten Arbeit und Vorbereitung der einzelnen Tätigkeiten ausgibt.
SELECT
SUM(CASE WHEN (Auftrag = 1758458 AND Taetigkeit = 110) THEN Arbeit ELSE 0 END)
AS Arbeit-1758458-110,
SUM(CASE WHEN (Auftrag = 1758458 AND Taetigkeit = 110) THEN Arbeit ELSE 0 END)
AS Vorbereitung-1758458-110
…
WHERE Datum >= ‚2017-02-01‘
AND Datum <= ‚2017-02-28‘ ;
was natürlich ein „Monster“ als Abfrage zusammenbaut ca 30 Aufträge * 15 Tätigkeiten * je 2 Werte
Gibt es da eine einfache Lösung diese Daten Abzufragen ?
mit der Optimierung von SQL-Abfragen kenne ich mich leider nicht aus, aber statt
kannst du auch
WHERE Datum BETWEEN '2017-02-01' AND '2017-02-28'
schreiben. Es ist ETWAS kürzer. Allerdings kenne ich nicht mal die Syntax mit CASE WHEN, muss ich gestehen, auch wenn ich mir denken kann, was sie macht, und dadurch auch deine Abfrage „entschlüsseln“ kann.
Zuallererst ein paar Vorschläge (ich vermute, es handelt sich um mySQL):
Geht wesentlich kürzer mit einem select distinct auftrag
Für die Datumseinschränkung krampft es mir beim
alles zusammen, denn hier müsstest Du sicher gehen, dass das Datumsformat auch im Format 'YYYY-MM-DD# dargestellt wird.
Und gerade auch deswegen gibt es in mySQL genügend Datumsfunktionalitäten. LIKE ist zum Vergleichen zwischen alphanumerischen Werten, Datumswerte sind sehr heikel, dazu werfe ich noch in den Raum, dass das Jahr vielleicht auch nicht so unwichtig ist?
Zuerst aber das Monatsrätsel (statt dem LIKE): month(DATUM)=2
Aber so würdest Du aus allen Jahren den Februar bekommen, nicht nur aus 2017, also fehlt noch ein: and year(DATUM)=2017
Oder?
Jedes RDBMS enthält eine Hülle von (Datums-)Funktionalitäten, die sollte man sich vorher mal anschauen
Noch was: Der Vergleich von Datumswerten kann sehr heikel werden (ich weiß jetzt nicht, ob mySQL beim Datum auch die Zeit mitabspeichert, auch wenn das Feld nur als DATE definiert ist).
So könnte es (ungetestet) bei
zu Problemen führen, da hier das Datum ‚2017-02-28 00:00:00‘ verglichen werden könnte und somit sämtliche Werte des 28.2.2017 rausfallen würden (da sie wohl ja erst nach Mitternacht angelegt wurden).
Unter Oracle beispielsweise wäre dies der Fall.