Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

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

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Orangensaft, 10 Januar 2017.

  1. Orangensaft

    Orangensaft Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Exakt das ist das Problem. Also, u.a. Weil auch der Rest nicht wirklich verständlich ist.
     
  3. Orangensaft

    Orangensaft Benutzer

    Der Rest meiner Ausführungen? Welcher Teil ist unklar?

    Aber wie umgehe ich das Problem, bzw. wieso wird dann für folgenden Einträge der restliche Teil des WHERE ignoriert?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Das weiß ich nicht und ich habe auch nicht wirklich Bock, aus mir nicht bekannten Dingen wie den beteiligten Tabellen, Daten etc. irgend etwas zu erraten.
     
  5. Orangensaft

    Orangensaft Benutzer

    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:

  6. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  7. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden