Doppelte Einträge ausschließen / Case Abfrage

Das hier liefert genau 4 Zeilen. Es gibt eine Akte, in der ein Vorgang 'H00' vorhanden ist. Gibt es denn im SELECT keine möglichkeit zu sagen, dass er nach einem Treffer auf H00 nicht weitersuchen soll?

Code:
SELECT DISTINCT
Akte.MandNr as [Mandant],
Akte.Az as [Aktenzeichen],
Akte.Stadium as [Stadium],
Kontakt.Name1 as [Nachname],
Kontakt.Vorname as [Vorname],
Mandant.KundeSeit as [Kunde seit],
Mandant.Verkaeufer as [Verkäufer],
EPVertrag.Bezeichnung as [EP-Vertrag],

IF t.Kuerzel = 'H00'
THEN
t.Kuerzel
ELSE NULL
END IF as [Vorgang],

IF t.Kuerzel = 'H00'
THEN
t.Belegdatum
ELSE NULL
END IF as [Datum]

FROM
Akte
  JOIN Kontakt
   ON Akte.Mandant_ID = Kontakt.Kontakt_ID
  JOIN Mandant
   ON Akte.Mandant_ID = Mandant.Kontakt_ID 
  JOIN EPVertrag
   ON Mandant.EPVertrag_ID = EPVertrag.EPVertrag_ID
  LEFT JOIN (
   SELECT
    Vorgang.Akte_ID,
    max(Vorgang.Belegdatum) as Belegdatum,
    VGVorlage.Kuerzel
   FROM
    Vorgang,
    VGVorlage
   WHERE
    Vorgang.VgVorl_ID = VgVorlage.VgVorl_ID
   GROUP BY Vorgang.Akte_ID, VGVorlage.Kuerzel)
   t on Akte.Akte_ID = t.Akte_ID
   WHERE
  Akte.MandNr = '606'
   AND
    (Akte.Uebernahme >= '2000-01-01' and Akte.Uebernahme <= '2014-07-03' )
 
Werbung:
Danke für Eure tolle Unterstützung! Ich habe den LEFT JOIN noch etwas angepasst und jetzt läuft es.

Code:
SELECT
Akte.MandNr as [Mandant],
Akte.Az as [Aktenzeichen],
Akte.Stadium as [Stadium],
Kontakt.Name1 as [Nachname],
Kontakt.Vorname as [Vorname],
Mandant.KundeSeit as [Kunde seit],
Mandant.Verkaeufer as [Verkäufer],
EPVertrag.Bezeichnung as [EP-Vertrag],

IF t.Kuerzel = 'H00'
THEN
t.Kuerzel
ELSE NULL
END IF as [Vorgang],

IF t.Kuerzel = 'H00'
THEN
t.Belegdatum
ELSE NULL
END IF as [Datum]

FROM
Akte
  JOIN Kontakt
   ON Akte.Mandant_ID = Kontakt.Kontakt_ID
  JOIN Mandant
   ON Akte.Mandant_ID = Mandant.Kontakt_ID 
  JOIN EPVertrag
   ON Mandant.EPVertrag_ID = EPVertrag.EPVertrag_ID
  LEFT JOIN (
   SELECT
    Vorgang.Akte_ID,
    max(Vorgang.Belegdatum) as Belegdatum,
    VGVorlage.Kuerzel
   FROM
    Vorgang
    join VGVorlage on (Vorgang.VgVorl_ID = VgVorlage.VgVorl_ID AND VgVorlage.Kuerzel = 'H00')
   GROUP BY Vorgang.Akte_ID, VGVorlage.Kuerzel)
   t on Akte.Akte_ID = t.Akte_ID
   WHERE
  Akte.MandNr = '606'
   AND
    (Akte.Uebernahme >= '2000-01-01' and Akte.Uebernahme <= '2014-07-03' )  
ORDER by Mandant.MandNr ASC, Akte.Az ASC
 
Sry bin noch nicht ganz zufrieden :)
Das IF im SELECT müsste bei einem passenden LEFT JOIN eigentlich wegfallen können. Probier mal bitte noch das hier:
Code:
SELECT    Akte.AZ AS [Aktenzeichen],
        t.Kuerzel AS [Vorgang],
        t.Belegdatum AS [Datum]
FROM    akte
LEFT JOIN (

SELECT    Vorgang.Akte_ID,
        max(Vorgang.Belegdatum) AS Belegdatum,
        VGVorlage.Kuerzel
FROM    Vorgang,
        VGVorlage
WHERE    Vorgang.VgVorl_ID = VgVorlage.VgVorl_ID
AND        VGVorlage.Kuerzel = 'H00'
OR NOT EXISTS (    SELECT    1
                FROM    VGVorlage
                WHERE    Kuerzel = 'H00'
                AND        VgVorl_ID = Vorgang.VgVorl_ID )
GROUP BY Vorgang.Akte_ID,VGVorlage.Kuerzel

) t ON Akte.Akte_ID = t.Akte_ID
WHERE    Akte.Uebernahme >= '"+DtoS(SQLDatumAb)+"'
AND        Akte.Uebernahme <= '"+DtoS(SQLDatumBis)+"'
 
Hallo,

ich hab es zwar versucht einzubauen - allerdings ohne Erfolg. Jetzt hab ich das vorherrige Statement erstmal gelassen. Das Problem ist, dass ich das mit den Unterabfragen leider immer noch nicht richtig verstanden habe. Ich bekomme immer nur Fehlermeldungen, sobald ich versuche eine Subselect einzubauen. Eventuell kann mir das ja einer an folgendem reduzierten Fall kurz erklären:

Ich habe zwei Tabellen.

Die Tabelle Akte enthält das Aktenzeichen (AZ)
Die Tabelle Vorgänge enthält sämtliche Vorgänge, die es zu einer Akte gibt.

Mich interessiert zu jedem Aktenzeichen immer nur ein einziger Vorgang. Ich habe mir daher überlegt, dass ich die Vorgänge per Case in eine Reihenfolge bringe - sozusagen eine Prioritätsliste und diese dann per top 1 nach dem ersten Vorgang abschneide. Das funktioniert super, aber wie baue ich diese Unterabfrage nun korrekt ein?

Unterabfrage:
Code:
Select top 1 Vorgang.Datum, Vorgang.Kurztext
from Akte
Join Vorgang on Vorgang.Akte_ID = Akte.Akte_ID
Where Akte.AZ =  '201100015959' // die Where Clausel setze ich hier nur damit ich es an einer einzelnen Akte Testen kann.
// dies soll natürlich für jede Akte des unten gewählten Mandanten ermittelt werdn.
Order BY
CASE
    WHEN Vorgang.Kurztext = '2. Mahnung'   THEN 1
    WHEN Vorgang.Kurztext = '1. Mahnung'   THEN 2
    WHEN Vorgang.Kurztext = 'Urteil'           THEN 2
    WHEN Vorgang.Kurztext = 'Schuldnerkarteianfrage'  THEN 3
    ELSE                                     99
  END;
Die Unterabfrage soll in diese Abfrage eingebaut werden:

Code:
Select akte.Az, (Vorgang.Datum) aus dem Subselect, (Vorgang.Kurztext) aus dem Subselect
from Akte
Where MandNr = 1234

Warum funktioniert das folgende Statement nicht?
Code:
SELECT Akte.AZ, test.Datum, test.Kurztext
from Akte
LEFT JOIN (Select top 1 Vorgang.Datum, Vorgang.Kurztext
from Akte
Join Vorgang on Vorgang.Akte_ID = Akte.Akte_ID
Order BY
CASE
    WHEN Vorgang.Kurztext = '2. Mahnung'   THEN 1
    WHEN Vorgang.Kurztext = '1. Mahnung'   THEN 2
    WHEN Vorgang.Kurztext = 'Urteil'           THEN 2
    WHEN Vorgang.Kurztext = 'Schuldnerkarteianfrage'  THEN 3
    ELSE                                     99
  END;
) test on Akte.Akte_ID = test.Akte_ID // Du hattest oben Akte.Akte_ID = t.Akte_ID gesetzt und ich habe das lediglich übernommen. In diesem Vereinfachten Beispiel will ich ja auch tie Tabellen Akte und Vorgang mit der Akte_ID aus beiden Tabellen miteinander verknüpfen.
WHERE mandnr = 606

Bekomme direkt die Fehlermeldung, dass er die Column 'Akte_ID' nicht finden kann.
 
Du hast auch ein paar Fehler eingebaut. Zunächst mal liefert dein Subselect keine Akte_ID aus (nur TOP 1 Vorgang.Datum, Vorgang.Kurztext), du versuchst aber damit zu joinen. Das ; hinter END dürfte auch Probleme machen.

Davon abgesehen liefert dein TOP 1 genau eine Akte mit den Vorgangsdaten zurück. Du willst aber einen Vorgang pro Akte haben, denke ich mal :)

Die Idee mit CASE und TOP 1 ist prinzipiell gut. Ich habs mal probiert, bin mir aber nicht sicher ob es geht weil ich im Subselect auf die ID im äußeren Select zugreifen muss.
Code:
SELECT    Akte.AZ,
        test.Datum,
        test.Kurztext
FROM    Akte
CROSS JOIN (
SELECT    TOP 1
        Vorgang.Datum,
        Vorgang.Kurztext
FROM    Vorgang
WHERE    Vorgang.Akte_ID = Akte.Akte_ID
ORDER BY
(    CASE
    WHEN Vorgang.Kurztext = '2. Mahnung'                THEN 1
    WHEN Vorgang.Kurztext = '1. Mahnung'                THEN 2
    WHEN Vorgang.Kurztext = 'Urteil'                    THEN 2
    WHEN Vorgang.Kurztext = 'Schuldnerkarteianfrage'    THEN 3
    ELSE 99
    END )

) test
WHERE    mandnr = 606
 
Davon abgesehen liefert dein TOP 1 genau eine Akte mit den Vorgangsdaten zurück. Du willst aber einen Vorgang pro Akte haben, denke ich mal :)
Genau! :)

Hab es eben mal durchlaufen lassen. Als Fehlermeldung kommt "Anweisung konnte nicht ausgeführt werden. Unzulässige Bezugsnamen auf Korrelationsname 'Akte'
 
Wenn ich den Subselect From um "Akte," erweitere, dann läuft das Statement durch und liefert mir auch ein Ergebnis. Allerdings steht in allen 3 Zeilen bei Datum und Kurztext das Gleiche und dies ist definitiv nicht korrekt. Es steht sogar ein Kurztext drin, den es als solchen zwar gibt, der aber in keiner Historie der drei Akten zu finden ist. Das verwirrt mich sehr.
 
Werbung:
Also es gibt eine etwas unelegante Lösung die aber gehen müsste:
Code:
SELECT    Akte.AZ,
        (    SELECT    TOP 1
                    Vorgang.Datum
            FROM    Vorgang
            WHERE    Vorgang.Akte_ID = Akte.Akte_ID
            ORDER BY
            (    CASE
                WHEN Vorgang.Kurztext = '2. Mahnung'                THEN 1
                WHEN Vorgang.Kurztext = '1. Mahnung'                THEN 2
                WHEN Vorgang.Kurztext = 'Urteil'                    THEN 2
                WHEN Vorgang.Kurztext = 'Schuldnerkarteianfrage'    THEN 3
                ELSE 99
                END ) ) AS Datum,
        (    SELECT    TOP 1
                    Vorgang.Kurztext
            FROM    Vorgang
            WHERE    Vorgang.Akte_ID = Akte.Akte_ID
            ORDER BY
            (    CASE
                WHEN Vorgang.Kurztext = '2. Mahnung'                THEN 1
                WHEN Vorgang.Kurztext = '1. Mahnung'                THEN 2
                WHEN Vorgang.Kurztext = 'Urteil'                    THEN 2
                WHEN Vorgang.Kurztext = 'Schuldnerkarteianfrage'    THEN 3
                ELSE 99
                END ) ) AS Kurztext
FROM    Akte
WHERE    mandnr = 606
Nur brauche ich hier für jede Spalte einen weiteren Subselect. Wenn jetzt zwei Vorgänge in deiner CASE Schleife den Wert 1 bekommen können rein theoretisch Datum und Kurztext aus unterschiedlichen Quelldatensätzen stammen. Das wird zwar nicht passieren und wenn wäre es egal da Kurztext ja gleich ist aber dennoch, schön ist das nicht.
Wenn deine Vorgang Tabelle einen PK hat kannst du auch diesen per Subselect holen und dann, auf den Akte.PK und den Vorgang.PK nochmal per LEFT JOIN die Vorgangstabelle joinen. Dann kannst du beliebig Spalten aus deinem TOP 1 Datensatz ausgeben.
 
Zurück
Oben