WHERE Bedingungen geschluckt - Selektion nach Datum + bool'sche Bedingungen

Orangensaft

Benutzer
Beiträge
5
Hallo werte Community,

Aufgabe: Es soll die aktuelleste Buchung ausgegeben werden. Es kann sein, dass z.B. die ersten 3 Buchungen eines Jahres auf eine gewisse projekt_id laufen und die restlichen dann auf die Vereinbarung und vice versa.

Der dafür zuständige Teil der Abfrage:
Code:
(SELECT TOP 1 buchung.beleg_datum FROM buchung WHERE ((person.id = buchung.person_id AND buchung.projekt_id = 31649) OR (buchung.vereinbarung_id = vereinbarung.id)) AND buchung.class = 'Einzahlung' ORDER BY buchung.buchungs_datum DESC) AS lezte_einzahlung_datum_vereinb,

Problem: Wenn bei einer Person das Jahr mit Buchungen auf die projekt_id anfängt, dann werden Buchungen die zu einem späteren Zeitpunkt passieren und auf eine Vereinbarung laufen nicht selektiert.

Bei Personen deren Buchungen nur auf Vereinbarungen laufen funktioniert die Abfrage ohne Probleme, nur sobald zwischendurch eine Buchung auf die projekt_id kommt werden später erfolgende Buchungen auf die Vereinbarung nicht selektiert.

Ich für jegliche Hinweise dankbar!

Liebe Grüße
O-Saft
 
Werbung:
Hier ein Auszug aus der Buchungstabelle:
upload_2017-1-10_15-54-50.png
2 unterschiedliche Beispiele. Die grüne Spalte ist jeweils die Spalte die von der Abfrage als TOP 1 ausgelesen wird. Beim oberen Beispiel funktioniert alles problemlos, während er beim unteren quasi "hängenbleibt".

Vereinbarung.id und person.id stimmen, da beim Auftrennen der SELECT in 2 getrennte mit jeweils einem Teil der WHERE die richtigen Ergebnisse ausgegeben werden.

Der Vollständigheit halber noch der ganze Code:
Code:
SELECT vereinbarung.vereinbarung_nr AS VereinbarungsNr,
        vereinbarung.id AS VereinbarungID,
        person.person_nr AS Personennummer,
        person.id AS persID,
        person.vorname AS Vorname,
        CONCAT(person.name, person.name2) AS Nachname,
        ISNULL(CONVERT(VARCHAR(10), vereinbarung.von, 104), '') AS vereinbarung_von,
        ISNULL(CONVERT(VARCHAR(10), vereinbarung.bis, 104), '01.01.3000') AS vereinbarung_bis,
        projekt.titel AS projekt_titel,
        CASE zahl_rhythmus_id
            WHEN '1' THEN 'Jährlich'
            WHEN '2' THEN 'Halbjährlich'
            WHEN '3' THEN '3 mal im Jahr'
            WHEN '4' THEN 'Quartalsweise'
            WHEN '5' THEN 'Alle 2 Monate'
            WHEN '6' THEN 'Monatlich'
            WHEN '7' THEN 'Einmalig'
        END AS Zahlrythmus,

        CASE zahl_typ_id
            WHEN '1' THEN 'Zahlschein'
            WHEN '2' THEN 'Dauerauftrag'
            WHEN '3' THEN 'Bankeinzug'
            WHEN '4' THEN 'Überweisung'
        END AS Zahltyp,

        vereinbarung_detail.betrag AS GeplanterBetrag,

        SUM(CASE WHEN
        (YEAR(CAST(buchungs_datum AS DATE)) = (YEAR(GETDATE())) AND (buchung.spenden_typ_id = 10996 OR buchung.spenden_typ_id = 11010 OR buchung.spenden_typ_id = 11037 OR buchung.spenden_typ_id = 10956 OR buchung.spenden_typ_id = 941 OR buchung.spenden_typ_id = 10989 OR buchung.spenden_typ_id = 10982 OR buchung.spenden_typ_id = 940) AND (buchung.vereinbarung_id = vereinbarung.id))
        THEN buchung.betrag_ein-buchung.betrag_aus ELSE 0 END) AS 'Bezahlt dieses Jahr',

        SUM(CASE WHEN
        (YEAR(CAST(buchungs_datum AS DATE)) = (YEAR(GETDATE())-1) AND (buchung.spenden_typ_id = 10996 OR buchung.spenden_typ_id = 11010 OR buchung.spenden_typ_id = 11037 OR buchung.spenden_typ_id = 10956 OR buchung.spenden_typ_id = 941 OR buchung.spenden_typ_id = 10989 OR buchung.spenden_typ_id = 10982 OR buchung.spenden_typ_id = 940) AND (buchung.vereinbarung_id = vereinbarung.id))
        THEN buchung.betrag_ein-buchung.betrag_aus ELSE 0 END) AS 'Bezahlt letztes Jahr',

        (SELECT TOP 1 buchung.betrag_ein FROM buchung WHERE (((person.id = buchung.person_id AND buchung.projekt_id = 31649) OR (buchung.vereinbarung_id = vereinbarung.id))) AND buchung.class = 'Einzahlung' ORDER BY buchung.buchungs_datum DESC) AS lezte_einzahlung_betrag_Vereinb,
        (SELECT TOP 1 buchung.beleg_datum FROM buchung WHERE (((person.id = buchung.person_id AND buchung.projekt_id = 31649) OR (buchung.vereinbarung_id = vereinbarung.id))) AND buchung.class = 'Einzahlung' ORDER BY buchung.buchungs_datum DESC) AS lezte_einzahlung_datum_Vereinb,
    
        ISNULL(CAST([vereinbarung].[text] AS NVARCHAR(700)), '') AS Kommentar,
        anschrift.zeile1,
        anschrift.zeile2,
        anschrift.zeile3,
        anschrift.zeile4,
        anschrift.zeile5,
        anschrift.zeile6

FROM vereinbarung
INNER JOIN person ON vereinbarung.person_id = person.id
INNER JOIN anschrift ON vereinbarung.person_id = anschrift.person_id
INNER JOIN buchung ON vereinbarung.person_id = buchung.person_id
INNER JOIN projekt ON vereinbarung.projekt_id = projekt.id
INNER JOIN vereinbarung_status ON vereinbarung.status_id = vereinbarung_status.id
INNER JOIN vereinbarung_detail ON vereinbarung.id = vereinbarung_detail.vereinbarung_id

WHERE vereinbarung_status.kurz = 'A' AND anschrift.zustell_adresse = 1 AND zahl_rhythmus_id = '6' 

GROUP BY vereinbarung.vereinbarung_nr, vereinbarung.id, person.person_nr, person.id, person.vorname, CONCAT(person.name, person.name2), vereinbarung.von , vereinbarung.bis,
projekt.titel, vereinbarung.zahl_rhythmus_id, vereinbarung.zahl_typ_id, vereinbarung_detail.betrag, CAST([vereinbarung].[text] AS NVARCHAR(700)),anschrift.zeile1, anschrift.zeile2, anschrift.zeile3,
anschrift.zeile4, anschrift.zeile5, anschrift.zeile6

ORDER BY projekt.titel

Anm. dazu: Bin SQL-"Noob", Performance ist nicht relevant, bitte über den ein oder anderen CAST hinwegsehen.

Danke!
 

Anhänge

  • upload_2017-1-10_15-35-55.png
    upload_2017-1-10_15-35-55.png
    60,5 KB · Aufrufe: 1
In Deinem Bild sehe ich keine grünen Spalten. Nur grüne Zeilen. Ich sehe außerdem offenbar kapotte Datumswerte.

Versuch Dein Problem soweit zu verallgemeinern, daß jemand hier sich die Tabellen mit den nur absolut nötigen Spalten und 2-3 Demodatensätzen erstellen und Dein Problem nachvollziehen kann.
 
Werbung:
Ohne wirklich zu verstehen was du da tust fällt mir deine Klammerung in der WHERE-Condition auf. Du hast:
Code:
WHERE (   person.id = buchung.person_id
AND     buchung.projekt_id = 31649
OR     buchung.vereinbarung_id = vereinbarung.id )
AND     buchung.class = 'Einzahlung'
Ich könnte mir aber vorstellen das:
Code:
WHERE    person.id = buchung.person_id
AND  (   buchung.projekt_id = 31649
OR     buchung.vereinbarung_id = vereinbarung.id )
AND     buchung.class = 'Einzahlung'
mehr Sinn ergibt.
 
Zurück
Oben