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

Sub Query

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von 2SR82, 26 November 2015.

  1. 2SR82

    2SR82 Benutzer

    Hallo,

    muss mich jetzt nach gut nem halben Jahr mal wieder mit SQL beschäftigen und komme schon wieder nicht klar.
    Hab schon einiges gelesen und denke das ich mit einer Sub Query arbeiten muss, bekomme das aber nicht richtig zum laufen.

    Folgende SQL Abfrage existiert bereits und funktioniert fehlerfrei

    Code:
    SELECT     TicketID, Zustaendig_Person, Zustaendig_Bereich, Betreff, Zieltermin, PrioNr, Prio, Prio_Kuerzel, StatusNr, Status, TicketTyp, ErstelltAm, ErstelltAmJahr, ErstelltAmMonat, PrioNiedrig, PrioNormal, PrioKritisch, PrioZeitkritisch, StatusOffen, StatusInBearbeitung, StatusErledigt, StatusStorniert, UeberZieltermin, DauerInStunden, DauerInMinuten, DauerInTagen, Kunde, Kunde_Kostenstelle, T_Company, T_Location
    FROM         VI_LuW_TC_Tickets
    WHERE     (ErstelltAmMonat = @Monat) AND (StatusNr <> 4) OR
                          (StatusNr <> 4) AND (@Monat = - 1) OR
                          (ErstelltAmMonat = @Monat) AND (@Status = - 1) OR
                          (@Monat = - 1) AND (@Status = - 1)
    Jetzt benötige ich aber noch eine bzw. eher zwei zusätzliche Bedingungen.

    Und zwar sollen nur Datensätze angezeigt werden bei denen der "Betreff" NICHT einen bestimmte String enthält UND GLEICHZEITIG das Feld "Kunde_Kostenstelle" NICHT Null ist.

    Anders gesagt, er soll alle Datensätze ignorieren die den String im "Betreff" enthalten und keine "Kunde_Kostenstelle" eingetragen haben. Wenn aber nur eine der beiden Bedingungen zutrifft soll der Wert trotzdem angezeigt werden.

    Code:
    (Betreff NOT LIKE 'SR: %') AND (Kunde_Kostenstelle <> '')
    so ungefähr soll also die zusätzliche Bedingung aussehen.

    Wenn ich das ganze jetzt aber zusammenschreibe funktioniert das nicht wie erwartet und er scheint alle Datensätze zu filtern bei denen auch schon nur eine der beiden Bedingungen zutrifft.

    Code:
    SELECT     TicketID, Zustaendig_Person, Zustaendig_Bereich, Betreff, Zieltermin, PrioNr, Prio, Prio_Kuerzel, StatusNr, Status, TicketTyp, ErstelltAm, ErstelltAmJahr, 
                          ErstelltAmMonat, PrioNiedrig, PrioNormal, PrioKritisch, PrioZeitkritisch, StatusOffen, StatusInBearbeitung, StatusErledigt, StatusStorniert, UeberZieltermin, 
                          DauerInStunden, DauerInMinuten, DauerInTagen, Kunde, Kunde_Kostenstelle, T_Company, T_Location
    FROM         VI_LuW_TC_Tickets
    WHERE
    (
      ((Betreff NOT LIKE 'SR: %') AND (Kunde_Kostenstelle <> '') )
    AND (
          (ErstelltAmMonat = @Monat) AND (StatusNr <> 4) OR
          (StatusNr <> 4) AND (@Monat = - 1)  OR
          (ErstelltAmMonat = @Monat) AND (@Status = - 1) OR
          (@Monat = - 1) AND (@Status = - 1)
        )
    )
    
    Die Klammern scheinen in SQL ja nicht wirklich eine Wirkung zu haben.
    Nur leider weiß ich jetzt nicht wie die richtige Syntax hier aussehen muss.
    Hoffe mir kann da jemand helfen.

    LG
     
  2. ukulele

    ukulele Datenbank-Guru

    Die Klammern haben sehr wohl ihre vorgesehene Wirklung, hier dein Query mal gekürzt:
    Code:
    SELECT    TicketID, Zustaendig_Person, Zustaendig_Bereich, Betreff, Zieltermin, PrioNr, Prio, Prio_Kuerzel, StatusNr, Status, TicketTyp, ErstelltAm, ErstelltAmJahr, ErstelltAmMonat, PrioNiedrig, PrioNormal, PrioKritisch, PrioZeitkritisch, StatusOffen, StatusInBearbeitung, StatusErledigt, StatusStorniert, UeberZieltermin, DauerInStunden, DauerInMinuten, DauerInTagen, Kunde, Kunde_Kostenstelle, T_Company, T_Location
    FROM    VI_LuW_TC_Tickets
    WHERE((    ErstelltAmMonat = @Monat
    OR        @Monat = - 1 )
    AND        StatusNr <> 4
    OR    (    ErstelltAmMonat = @Monat
    OR        @Monat = - 1 )
    AND        @Status = - 1 )
    AND    (    Kunde_Kostenstelle <> ''
    OR        Kunde_Kostenstelle = ''
    AND        Betreff NOT LIKE 'SR: %' )
    Dein Problem ist vermutlich eher das Betreff NOT LIKE 'SR: %' AND Kunde_Kostenstelle <> '' nicht deinem beschriebenen Wunsch entspricht. Es setzt vorraus das beide Bedingungen wahr sind, also weder Betreff SR enthält, noch eine Kostenstelle eingetragen ist. Eine der Bedingungen darf aber zutreffen, nur eben nicht beide "gleichzeitig". Also habe ich Kostenstelle verboten oder Kostenstelle erlaubt aber dann SR verboten, geht natürlich auch andersrum.
     
    2SR82 gefällt das.
  3. 2SR82

    2SR82 Benutzer

    Hey,

    danke für deine Hilfe.
    Also da war noch irgendwie was verdreht, zumindest hat er mir noch nicht die Werte geliefert die ich brauchte, aber mit deinem Denkanstoß hat es letztlich dann doch funktioniert :)

    Im Prinzip habe ich einfach die alte Bedingung komplett eingeklammert und dann deine Ergänzung noch angehängt. Funktioniert super und sieht dann wie folgt aus.

    Code:
    WHERE     ((ErstelltAmMonat = @Monat) AND (StatusNr <> 4) OR
                          (StatusNr <> 4) AND (@Monat = - 1) OR
                          (ErstelltAmMonat = @Monat) AND (@Status = - 1) OR
                          (@Monat = - 1) AND (@Status = - 1))
    AND    (    Kunde_Kostenstelle <> '' 
    OR        Kunde_Kostenstelle IS NULL  AND  Betreff NOT LIKE 'SR: %' )
    
    Vielen Dank nochmal!
     
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