none
Letzte Buchung jeden Tages ermitteln und anzeigen, wenn Buchungsart = START RRS feed

  • Frage

  • Hallo,

    ich habe eine Tabelle, wo Buchungen von mehreren Clients geschrieben werden. Für die Frage sind die Felder "Buchungszeitpunkt" und "Buchungsart" wichtig. Ich möchte nun die Buchungen ausgegeben bekommen, die nach einem "START" kein "ENDE" haben. Es reicht hier IMHO aus die letzte Buchung des Tages zu prüfen, ob diese "START" ist .

    Ich müsste also für einen vorzugebenen Zeitraum und einem bestimmten Client die Datensätze nach Jahr/Monat/Tag gruppieren, in der Gruppierung den zeitlich höchsten Datensatz zu nehmen und prüfen, ob dieser Buchungsart = START ist. Wenn ja, wird dieser Datensatz oder wenigstens das Datum auszugeben.

    Als Ergebnis werden alle Tage ausgegeben, an denen die letzte Buchungsart = START ist, also eine ENDE-Buchung fehlt.

    Den zeitlich letzten Datensatz zu ermitteln, ist so möglich:

    SELECT YEAR(Buchungszeitpunkt), MONTH(Buchungszeitpunkt), DAY(Buchungszeitpunkt), MAX(Buchungszeitpunkt)
    FROM Arbeitsschrittjournal
    WHERE (Buchungszeitpunkt >= '01.01.2013 00:00:00') AND (Buchungszeitpunkt <= '31.03.2013 23:59:59') AND
          (Client = 'xyz')
    GROUP BY YEAR(Buchungszeitpunkt), MONTH(Buchungszeitpunkt), DAY(Buchungszeitpunkt)
    ORDER BY YEAR(Buchungszeitpunkt) ASC, MONTH(Buchungszeitpunkt) ASC, DAY(Buchungszeitpunkt) ASC

    Nur wie hier nun den kompletten Datensatz anzeigen lassen und noch wichtiger, auf BuchungartId = 1 (=START) filtern? Über HAVING geht das ja nur, wenn ich danach auch gruppiere.

    mfg


    Donnerstag, 14. März 2013 11:16

Antworten

  • Hallo,

    ich beantworte mir mal die Frage selbst und diese SQL-Abfrage tut wohl was sie soll (Performance erst einmal vernachlässigt...):

    SELECT asj1.Buchungszeitpunkt, 
           asj1.Client
    FROM   Arbeitsschrittjournal asj1
    WHERE  (asj1.Buchungszeitpunkt >= '01.01.2012 00:00:00') AND
           (asj1.Buchungszeitpunkt <= '31.03.2013 23:59:59') AND
           (asj1.Buchungszeitpunkt IN (
                SELECT MAX(Buchungszeitpunkt)
                FROM Arbeitsschrittjournal asj2
                WHERE (asj2.Buchungszeitpunkt >= '01.01.2012 00:00:00') AND
                      (asj2.Buchungszeitpunkt <= '31.03.2013 23:59:59') AND
                      (asj2.Client = asj1.Client)
                GROUP BY YEAR(asj2.Buchungszeitpunkt),
                         MONTH(asj2.Buchungszeitpunkt),
                         DAY(asj2.Buchungszeitpunkt)) AND
           (asj1.BuchungsartId = 1))
    ORDER BY asj1.Client ASC,
             asj1.Buchungszeitpunkt ASC

    Das nun noch innerhalb des Programms (VS 2008, C#, Windows Forms) in einer Schleife über alle Clients und jeweils die zurückgelieferte Liste mit AddRange der Ergebnisliste zugefügt und dann angezeigt.

    mfg



    • Als Antwort markiert HessischerBub Donnerstag, 14. März 2013 17:12
    • Tag als Antwort aufgehoben HessischerBub Donnerstag, 14. März 2013 17:13
    • Als Antwort markiert HessischerBub Donnerstag, 14. März 2013 17:15
    • Bearbeitet HessischerBub Donnerstag, 14. März 2013 17:16 SQL-Anweisung angepasst
    • Tag als Antwort aufgehoben HessischerBub Donnerstag, 14. März 2013 17:16
    • Als Antwort markiert HessischerBub Donnerstag, 14. März 2013 17:17
    Donnerstag, 14. März 2013 12:32