Registriert seit: 29. Nov 2010
3.072 Beiträge
Delphi 2010 Enterprise
|
AW: Max(Datum) Min(Datum)
2. Mai 2013, 14:21
Man kann es kann es zunächst netter formatieren, dann stirbt man nicht so schnell an Augenkrebs.
Code:
SELECT ma_s.ID, ma_s.Personalnummer as Personalnr, ma_s.Nachname as Name,
ma_s.Vorname, bd.Datum, bd.Kuerzel, bd.Feiertag, a.Bezeichnung,
IIF(be.Pause = 0, null, ZMIF.MinToHour(be.Pause)) AS PauseH,
ZMIF.MinToIHour(be.Pause) as PauseIH,
IIF(be.Tagesbrutto = 0, null, ZMIF.MinToHour(be.Tagesbrutto)) AS TagesbruttoH,
ZMIF.MinToIHour(be.Tagesbrutto) as TagesbruttoIH,
IIF(be.Mehrarbeit = 0, null, ZMIF.MinToHour(be.Mehrarbeit)) AS MehrarbeitH,
ZMIF.MinToIHour(be.Mehrarbeit) as MehrarbeitIH, b.BuchungsArt,
min(b.Me1) as Me1, max(b.Me2) as Me2, b.Flag
FROM MA_Stammdaten ma_s
LEFT OUTER JOIN Abteilungen a
ON ma_s.ID_Abteilungen = a.ID
LEFT OUTER JOIN Buchungsdatei bd
ON ma_s.ID = bd.ID_MA_Stammdaten
LEFT OUTER JOIN Buchungen b
ON bd.ID_MA_Stammdaten = b.ID_MA_Stammdaten
AND bd.Datum = b.Datum
LEFT OUTER JOIN FEHLTAGEDEFINITION ftd
ON bd.Fehltag = ftd.Kuerzel
LEFT OUTER JOIN B_Ergebnisse be
ON bd.ID = be.ID_Buchungsdatei
WHERE ma_s.ID IN (3)
and Month(bd.Datum) = 2
and Year(bd.Datum) = 2013
GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18
UNION ALL
SELECT ma_s.ID, ma_s.Personalnummer as Personalnr, ma_s.Nachname as Name,
ma_s.Vorname, bd.Datum, bd.Kuerzel, bd.Feiertag, a.Bezeichnung,
IIF(be.Pause = 0, null, ZMIF.MinToHour(be.Pause)) AS PauseH,
ZMIF.MinToIHour(be.Pause) as PauseIH,
IIF(be.Tagesbrutto = 0, null, ZMIF.MinToHour(be.Tagesbrutto)) AS TagesbruttoH,
ZMIF.MinToIHour(be.Tagesbrutto) as TagesbruttoIH,
IIF(be.Mehrarbeit = 0, null, ZMIF.MinToHour(be.Mehrarbeit)) AS MehrarbeitH,
ZMIF.MinToIHour(be.Mehrarbeit) as MehrarbeitIH, b.BuchungsArt,
b.Me1 as Me1, b.Me2 as Me2, b.Flag
FROM MA_Stammdaten ma_s
LEFT OUTER JOIN Abteilungen a
ON ma_s.ID_Abteilungen = a.ID
LEFT OUTER JOIN Buchungsdatei bd
ON ma_s.ID = bd.ID_MA_Stammdaten
LEFT OUTER JOIN Buchungen b
ON bd.ID_MA_Stammdaten = b.ID_MA_Stammdaten
AND bd.Datum = b.Datum
LEFT OUTER JOIN FEHLTAGEDEFINITION ftd
ON bd.Fehltag = ftd.Kuerzel
LEFT OUTER JOIN B_Ergebnisse be
ON bd.ID = be.ID_Buchungsdatei
WHERE ma_s.ID IN (3)
and Month(bd.Datum) = 2
and Year(bd.Datum) = 2013
ORDER By ma_s.ID
Ich kenne mich mit ADS nicht aus, aber die üblichen Verdächtigen wären:
Das "in (3)" vielleicht durch = 3 ersetzen,
Die Year und Month Funktion ersetzen durch eine gleichwertige Bereichsabfrage:
Code:
.."bd.datum" >= NiedrigsterDatumsWert
and .."bd.datum" <= HöchsterDatumsWert
oder between
Die Funktionen vermiesen wahrscheinlich den Indexzugriff auf das Datumsfeld (sofern hier Indizierung gegeben ist)
Generell hilft hier systematisch nur, den Ausführungsplan ausgeben zu lassen. Das RDBMS selbst weiß meist am besten, was es tut.
Gruß, Jo
|