![]() |
Datenbank: ADS • Version: 10 • Zugriff über: Delphi
Max(Datum) Min(Datum)
Moin,
habe folgenden Datenbestand:
Code:
Ich möchte mir aber nur die früheste Kommen und die letzte Gehen Buchung zusammenfassen.
ID--Datum--Buchungsart--Buchung1--Buchung2
1--01.04.13--A--07:00--16:00 2--01.04.13--P--11:00--11:30 3--01.04.13--A--17:00--20:00 4--01.04.13--P--18:00--18:30 Buchungen der Buchungsart P Sollen nicht berücksichtigt werden. Folgendes soll rauskommen:
Code:
Kann mir bitte jemand einen Tipp geben.
A: 07:00 - 18:30
P: 11:00 - 11:30 P: 18:00 - 18:30 Über min(Buchung1) und max(Buchung2) hab ich's schon probiert, aber dann fasst er auch die P Buchugnen zusammen. Und über
Delphi-Quellcode:
hab ich probleme mit dem group by ..
IIF(b.BuchungsArt = 'A', min(Buchung1), Buchung1) as Buchung1,
IIF(b.BuchungsArt = 'A', max(Buchung2), Buchung2) as Buchung2, |
AW: Max(Datum) Min(Datum)
Also du musst wohl nach Datum und Buchungsart gruppieren und die Buchungsarten getrennt behandeln:
SQL-Code:
Falls diese Abfrage läuft, kann man die gesamte Datenmenge auch noch nach Datum sortieren.
(SELECT Datum, Buchungsart, Min(buchung1) as Startzeit, Max(buchungs2) as Endzeit FROM Buchungstabelle
WHERE Buchungsart = 'A' GROUP BY Datum, Buchungsart) UNION ALL SELECT Datum, Buchungsart, buchung1 as Startzeit, buchungs2 as Endzeit FROM Buchungstabelle WHERE Buchungsart <> 'A' |
AW: Max(Datum) Min(Datum)
Super, genau das hab ich gebraucht.
Jetzt muss ich das ganze nur noch in meinen bestehenden SQL einbauen. Besten Dank, falls noch Fragen sein sollten melde ich mich nochmal. MfG |
AW: Max(Datum) Min(Datum)
Hi,
nochmal ne Frage zu meinem SQL. Hab das UNION SELECT eingebaut. Kann man den SQL noch kürzen und perfomanter machen:
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 |
AW: Max(Datum) Min(Datum)
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:
oder between
.."bd.datum" >= NiedrigsterDatumsWert
and .."bd.datum" <= HöchsterDatumsWert 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. |
AW: Max(Datum) Min(Datum)
Hi jobo,
die ma_s.ID IN (3) kann ich nicht durch = ersetzen, da es auch sein kann, dass ich durch eine Funktion mehrere ID's bekommen, daher muss ich das ganze über IN lösen. Das mit dem Datum werd ich umbauen. Jetzt steh ich aber vor einem anderen Problem, vll kann mir da jmd helfen ... Momentan werden in meiner Ergebnismenge nur Tage angezeigt, wo der Mitarbeiter eine Buchung hat. Tabelle Buchungsdatei: Enthält für jeden Tag einen Eintrag Tabelle Buchungen: Enthält nur Einträge an denen der MA gebucht hat. Ich joine ja die Tabelle Buchugnen auf die Buchungsdatei und verknüpf sie über die ID des MA's als auch über das Datum. Liegt das Problem hier? |
AW: Max(Datum) Min(Datum)
Du arbeitest ausschließlich mit Outer Joins.
In Deinem Statement musst Du aber dafür sorgen, dass die Tabelle mit allen Tagen (Buchungsdatei) vollständig dargestellt wird -sozusagen als Master- und nicht schon durch vorgelagerte Outer joins gesiebt wird. Dazu würde ich evtl. die Tabelle Buchungsdatei als Kerntabelle wählen und davon ausgehend die restlichen Subtabellen je nach Bedarf mit Full oder Outer Joins angliedern. |
AW: Max(Datum) Min(Datum)
Versuch mal statt:
Code:
das hier:
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
Code:
Ist aber ungetestet!
FROM MA_Stammdaten ma_s
LEFT OUTER JOIN Abteilungen a ON ma_s.ID_Abteilungen = a.ID LEFT OUTER JOIN Buchungsdatei bd 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 ON ma_s.ID = bd.ID_MA_Stammdaten |
AW: Max(Datum) Min(Datum)
Zitat:
Code:
kommt aber wie schon gesagt auf deine DB an.
...
and to_char(bd.Datum,'YYYYMM')='201302' ... Gruß K-H |
AW: Max(Datum) Min(Datum)
to_char und jede andere Funktion über einem Datenbankfeld in einer Where-Clause würde aber die Indexverwendung verhindern, sofern kein Funktion-Index (oder vergleichbare Verfahren anderer Systeme) extra dafür angelegt wurde.
Im Prinzip nicht schlimm, erst Recht wenn dort eh kein Index definiert ist oder dieser aus anderen Gründen nicht greift bzw irrelevant ist. Da es sich rein namentlich aber um große Kerntabellen zu handeln scheint und Performance gefragt war, sollte man sowas vermeiden. Wie gesagt, keine Ahnung, was ADS da tolles zu bieten hat, aber die Problematik ist grundlegend und dürfte herstellerunabhängig gelten. |
AW: Max(Datum) Min(Datum)
Besser wäre es zuerst die Union zu bilden und dann dieses Ergebnis mit den Stammdaten zu verknüpfen.
Also ganz grob so
SQL-Code:
Der Name "DevTbl" ist ein Alias für die innere Abfrage mit UNION ALL.
SELECT DevTbl.*, Stammdaten.* FROM
(SELECT ... FROM Buchungen WHERE ... GROUP BY ... UNION ALL SELECT ... FROM Buchungen WHERE ... GROUP BY ...) DevTbl INNER JOIN Stammdaten ON Stammdaten.xxx=DevTbl.xxx |
AW: Max(Datum) Min(Datum)
Hi,
werd ich alles gleich nochmal ausprobieren, hab nämlich noch kleine Ergebnisprobleme mit dem SQL. :evil: Ich meld mich wieder . |
AW: Max(Datum) Min(Datum)
Ich steh etwas auf dem Schlauch.
Ich kriege mit dem SQL zu Beginn des Threads meine Ergebnismenge zwei mal.
Code:
01.02.2013
02.02.2013 ... 28.02.2013 01.02.2013 02.02.2013 28.02.2013
Code:
Kann mir nicht erklären warum !?!
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 Außerdem werden Pausezeiten nicht einzeln aufgelistet sondern auch nur die erste Buchung und die letzte.
Code:
SQL Ergebnis ..
Arbeitszeit: 07:00 - 16:15
Pause: 11:49 - 12:31 Arbeitszeit: 17:00 - 20:00 Pause: 18:00 - 18:30
Code:
.. was ja falsch ist, da die Pausen nicht zusammengefasst werden sollen.
Arbeitszeit: 07:00 - 20:00
Pause: 11:49 - 18:30 |
AW: Max(Datum) Min(Datum)
Du solltest zunächst mal, wie in Beitrag #2 bereits erwähnt wurde, die where-Bedingungen ergänzen (im ersten Teil Buchungsart='A', im zweiten Buchungsart='P')
|
AW: Max(Datum) Min(Datum)
Hi, nehm ich die Bedingungen (im ersten Teil Buchungsart='A', im zweiten Buchungsart='P') in meine WHERE Bedingungen auf, werden nur noch Tage mit Buchungen angezeigt.
Die zweite WHERE Bedingung müsste ich ich auch nicht nur auf 'P' beschränken, sondern eigentlich <> 'A' da es auch Buchungsarten wie 'D' oder 'U' gibt und an Wochenenden ist die Buchungsart ' ' Lass ich die Bedinungen (Buchungsart = 'A' und 'P') komplett raus dann werden alle Tage angezeigt, er berechnet aber für alle BuchungsArten das min und das max Hat jmd noch ne Idee? |
AW: Max(Datum) Min(Datum)
Mir fallen 2 Möglichkeiten ein:
1. Anstatt das where anzupassen, das ganze in den join packen (... on ... and buchungsart='P') 2. Bei der "Berechnung Min/Max" ein IIF einbauen: min(iif(buchungsart, 'P', b.Me1, null)) as Me1 |
AW: Max(Datum) Min(Datum)
Zitat:
Code:
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.
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 ==> In meinem Ergebnis werden jetzt aber wieder nur die Buchungen mit Buchungsart "A" angezeigt :x:x Zitat:
Code:
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.
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 Ich verzweifel langsam an diesem SQL ... Kollege hat mir vorgeschlagen, mit einem CASE zu arbeiten ?!? |
AW: Max(Datum) Min(Datum)
Ohne mich jetzt bis ins letzte Detail mit dem select befasst zu haben, hast du mal versucht das "and b.BuchungsArt = xxx" nicht innerhalb des joins sondern erst beim where abzufragen, denn das kann oft ein komplett anderes Ergebnis erzielen?
|
AW: Max(Datum) Min(Datum)
Zitat:
Zitat:
Zitat:
Zitat:
Evtl. solltest/musst du auch noch Beitrag #8 beachten. |
AW: Max(Datum) Min(Datum)
Hi,
ja das hab ich auch schon probiert. (wurde in einem vorherigen Post auch schon vorgeschlagen) Liefert mir aber auch nicht das was ich brauch. |
AW: Max(Datum) Min(Datum)
Zitat:
In meinen Anfangszeiten habe ich meine Chefs immer dafür gehasst, wenn sie mir sagten, wirf erstmal alles weg und machs neu, aber da ist echt was dran. |
AW: Max(Datum) Min(Datum)
Zitat:
Was mir auffällt (ich kann aber auch etwas übsehen haben)
Code:
wofür soll das gut sein?
LEFT OUTER JOIN FEHLTAGEDEFINITION ftd
ON bd.Fehltag = ftd.Kuerzel (Nützt nix schad aber auch nicht gilt hier nicht) Gruß K-H |
AW: Max(Datum) Min(Datum)
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Hab zunächst mal den Tipp aus Beitrag #8 probiert. Hat mir leider auch nicht weitergeholfen, hab so nur jeden Eintrag doppelt angezeigt bekommen ... bin jetzt aber schon ein Stückchen weiter... Ich hab lediglich das ORDER BY am Ende umgebaut. Die Ergebnismenge war die ganze Zeit "fast" richtig, nur falsch sortiert .... :wall:
Code:
Letzte Problem vor dem ich jetzt steh ist folgendes:
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 <> '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 ORDER BY bd.Datum, ma_s.ID - An Wochenenden hat er pro Tag zwei Datensätze ... Wenn man den Screenshot im Anhang betrachtet sieht man, dass er jetzt nur noch das min/max aus 'A' Buchungen bildet und alle anderen Buchungen alles anzeigt ... Ich schau mir das heute Abend nochmal in Ruhe an und werd mich morgen wieder melden. |
AW: Max(Datum) Min(Datum)
[QUOTE=Metallicwar;1215325]
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz