Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
Delphi XE Architect
|
AW: Max(Datum) Min(Datum)
14. Mai 2013, 15:14
Zitat:
1. Anstatt das where anzupassen, das ganze in den join packen (... on ... and buchungsart='P')
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 and b.BuchungsArt = 'A'
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, b.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 and b.BuchungsArt = 'P'
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
Hab die Bedingung für die BuchungsArt nun in den Join gepackt (oben "and b.BuchungsArt = 'A' und unten "and b.BuchungsArt = 'P' wobei ich immmernoch der Meinung bin, dass ich hier "and b.BuchungsArt <> 'A' schreiben muss.
==> In meinem Ergebnis werden jetzt aber wieder nur die Buchungen mit Buchungsart "A" angezeigt
Zitat:
2. Bei der "Berechnung Min/Max" ein IIF einbauen:
min(iif(buchungsart, 'P', b.Me1, null)) as Me1
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(IIF(b.BuchungsArt = 'P', b.Me1, null)) as Me1,
max(IIF(b.BuchungsArt = 'P', b.Me2, null)) as Me2, b.Flag
Macht meiner Meinung nach keinen Sinn, im max/min Select zu prüfen ob die BuchungsArt 'P' ist, dann werden die 'A' Buchungen genullt und immer noch max/min von 'P' Buchungen angezeigt.
Ich verzweifel langsam an diesem SQL ...
Kollege hat mir vorgeschlagen, mit einem CASE zu arbeiten ?!?
|