Hilfe SQL abfrage gesucht

Hallo an Alle,

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 freundlichen Grüßen

Stefan

Hallo Stefan,

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.

Gruß
Christa

1 Like

man lernt nie aus ! Den kannte ich z.B. noch nicht

Danke

So mit etwas rumprobieren habe ich nun diesen Ansatz:

SELECT
Auftrag,Taetigkeit, SUM(Arbeit), SUM(Vorbereitung)
FROM sql_tabelle
WHERE
Datum LIKE ‚%-02-%‘
GROUP BY Auftrag,Taetigkeit;

Was das ganze doch ein bisschen „schlanker“ macht.

bin aber immer noch für Vorschläge offen !

Cu Stefan

Hi!

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 :wink:

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.

Grüße,
Tomh