none
SQL Select mit where Klausel RRS feed

  • Frage

  • Hallo, habe folgendes Problem für ein Controlling und komme mit einem SQL nicht weiter:

    Durch die where Klausel werden die Datensätze der Projekt Tabelle immer eingeschränkt. Ich benötige aber alle Datensätze aus der Tabelle Projekt und nicht nur die Datensätze die über die ProjNr verdrahtet sind.

    Habe den Join schon rausgenommen, dann erhalte ich zwar sämtliche Datensätze der Projekt Tabelle aber der Summenwert stimmt natürlich nicht.

    Welche Lösungsansätze gibt es?

    Vielen Dank Andreas

    -----------

    Select
      Projekt.ProjNr,
      Sum(BstLagerBuchung.Menge * BstLagerBuchung.NettoPreis) As
      Fremdleistungskosten
    From
      BstLagerBuchung right Join
      Projekt On Projekt.ProjNr = BstLagerBuchung.ProjNr

    where bstlagerbuchung.koart in
      (select bstlagerbuchung.koart from bstlagerbuchung
       where
       (BstLagerBuchung.KoArt = 90) Or
      (BstLagerBuchung.KoArt = 12))
     
    Group By
      Projekt.ProjNr, Bstlagerbuchung.KoArt  

    Montag, 14. Oktober 2013 17:49

Antworten

  • Hallo Andreas,

    genau das macht das zweite, von mir gepostete SQL Statement.

    Da nur die Datensätze, bei denen KoArt NULL, 12 oder 90 ist, für die Berechnung herangezogen werden und Menge und NettoPreis bei einer nicht vorhandenenen Zuordnung über ProjNr NULL sind, sollte die Berechnung nun so passen.

    Falls Du anstelle von NULL im Feld Fremdleistungskosten bei den betreffenden Zeilen gerne 0 stehen hättest, geht das aber auch:

    SELECT   Projekt.ProjNr,
             Bstlagerbuchung.KoArt,
             SUM( ISNULL( BstLagerBuchung.Menge, 0 ) * ISNULL( BstLagerBuchung.NettoPreis, 0 ) ) AS Fremdleistungskosten
    FROM     Projekt
             LEFT JOIN AS BstLagerBuchung ON Projekt.ProjNr = BstLagerBuchung.ProjNr
    WHERE    Bstlagerbuchung.KoArt IS NULL OR Bstlagerbuchung.KoArt IN ( 90, 12 ) 
    GROUP BY Projekt.ProjNr,
             Bstlagerbuchung.KoArt

    Falls es damit immer noch nicht passen sollte, poste bitte Beispieldaten und exakt das gewünschte Ergebnis aus diesen Beispieldaten.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community



    Montag, 14. Oktober 2013 19:09
    Moderator

Alle Antworten

  • Hallo Andreas,

    SELECT   Projekt.ProjNr,
             BstLagerBuchung.KoArt,
             SUM( BstLagerBuchung.Menge * BstLagerBuchung.NettoPreis ) AS Fremdleistungskosten
    FROM     Projekt
             LEFT JOIN AS BstLagerBuchung ON Projekt.ProjNr = BstLagerBuchung.ProjNr
    WHERE    BstLagerBuchung.KoArt IN ( 90, 12 ) 
    GROUP BY Projekt.ProjNr,
             Bstlagerbuchung.KoArt
    

    sollte eigentlich genau das liefern, was Du suchst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 14. Oktober 2013 18:09
    Moderator
  • Warum stimmt der Summenwert dann nicht?
    Wenn ich das richtig lese, würden die Projekte, die nicht in beiden Tabellen angetroffen werden, dann unter (NULL) gruppiert, und erhalten ihre eigene Summe.

    Vielleicht übersehe ich ja etwas.


    Andreas Wolter | Microsoft Certified Master SQL Server

    Blog: www.insidesql.org/blogs/andreaswolter
    Web: www.andreas-wolter.com | www.SarpedonQualityLab.com

    Montag, 14. Oktober 2013 18:21
  • Hallo Stefan, vielen Dank für die schnelle Antwort. Das Ergebnis liefert allerdings nur die mit der [BstLagerBuchung.Projnr] verdrahteten Datensätze. Benötigt werden allerdings ALLE Datensätze aus der Tabelle Projekt.

    Nehme ich die Where Klausel herau, werden mir in der Projekt-Tabelle zwar alle Datensätze angezeigt, die Sum Funktion bezieht sich dann aber wiederum auf alle BstLagerBuchung.KoArt und nicht nur auf die Kriterien 90 und 12

    Hast Du da noch eine Idee?

    Viele Grüße

    Abdreas

    Montag, 14. Oktober 2013 18:33
  • Hallo Andreas, die Summierung ist richtig.

    In der Projekt Tabelle befinden sich aber erheblich mehr Datensätze und ich benötige für ein Controlling ALLE Datensätze aus der Projekt-Tabelle und aus der BstLagerBuchung Tabelle die verdrahteten Datensätze mit der Summierung.

    Viele Grüße
    Andreas

    Montag, 14. Oktober 2013 18:38
  • Hallo Andreas,

    nuja, was soll da auch anderes rauskommen, wenn Du auf KoArt 12 und 90 filterst. In dem Fall musst Du zusätzlich KoArt NULL mit in die Abfrage nehmen.

    SELECT   Projekt.ProjNr,
             Bstlagerbuchung.KoArt,
             SUM( BstLagerBuchung.Menge * BstLagerBuchung.NettoPreis ) AS Fremdleistungskosten
    FROM     Projekt
             LEFT JOIN AS BstLagerBuchung ON Projekt.ProjNr = BstLagerBuchung.ProjNr
    WHERE    Bstlagerbuchung.KoArt IS NULL OR Bstlagerbuchung.KoArt IN ( 90, 12 ) 
    GROUP BY Projekt.ProjNr,
             Bstlagerbuchung.KoArt
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 14. Oktober 2013 18:49
    Moderator
  • ...

    Nehme ich die Where Klausel herau, werden mir in der Projekt-Tabelle zwar alle Datensätze angezeigt, die Sum Funktion bezieht sich dann aber wiederum auf alle BstLagerBuchung.KoArt und nicht nur auf die Kriterien 90 und 12

    ...

    Ach so

    dann nehme ich an ein

    CASE WHEN KoArt IN ( 90, 12 ) THEN SUM ...

    anstelle der Summenfunktion tut's


    Andreas Wolter | Microsoft Certified Master SQL Server

    Blog: www.insidesql.org/blogs/andreaswolter
    Web: www.andreas-wolter.com | www.SarpedonQualityLab.com

    Montag, 14. Oktober 2013 18:54
  • Hallo Stefan,

    du hast ja so recht! Mein Problem ist, dass sich die [Fremdlistungskosten]  

      SUM( BstLagerBuchung.Menge * BstLagerBuchung.NettoPreis ) AS Fremdleistungskosten

    nur aus Datensätze berechnen sollen, die die BstLagerBuchung.KoArt 90 oder 12 haben.

    Viele Grüße

    Andreas

    Montag, 14. Oktober 2013 19:00
  • Hallo Andreas,

    genau das macht das zweite, von mir gepostete SQL Statement.

    Da nur die Datensätze, bei denen KoArt NULL, 12 oder 90 ist, für die Berechnung herangezogen werden und Menge und NettoPreis bei einer nicht vorhandenenen Zuordnung über ProjNr NULL sind, sollte die Berechnung nun so passen.

    Falls Du anstelle von NULL im Feld Fremdleistungskosten bei den betreffenden Zeilen gerne 0 stehen hättest, geht das aber auch:

    SELECT   Projekt.ProjNr,
             Bstlagerbuchung.KoArt,
             SUM( ISNULL( BstLagerBuchung.Menge, 0 ) * ISNULL( BstLagerBuchung.NettoPreis, 0 ) ) AS Fremdleistungskosten
    FROM     Projekt
             LEFT JOIN AS BstLagerBuchung ON Projekt.ProjNr = BstLagerBuchung.ProjNr
    WHERE    Bstlagerbuchung.KoArt IS NULL OR Bstlagerbuchung.KoArt IN ( 90, 12 ) 
    GROUP BY Projekt.ProjNr,
             Bstlagerbuchung.KoArt

    Falls es damit immer noch nicht passen sollte, poste bitte Beispieldaten und exakt das gewünschte Ergebnis aus diesen Beispieldaten.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community



    Montag, 14. Oktober 2013 19:09
    Moderator
  • Hallo Stefan, genau das war es -- Vielen Dank!!

    Andreas

    Montag, 14. Oktober 2013 19:20
  • ...
    SELECT   Projekt.ProjNr,
             Bstlagerbuchung.KoArt,
             SUM( ISNULL( BstLagerBuchung.Menge, 0 ) * ISNULL( BstLagerBuchung.NettoPreis, 0 ) ) AS Fremdleistungskosten
    FROM     Projekt
             LEFT JOIN AS BstLagerBuchung ON Projekt.ProjNr = BstLagerBuchung.ProjNr
    WHERE    Bstlagerbuchung.KoArt IS NULL OR Bstlagerbuchung.KoArt IN ( 90, 12 ) 
    GROUP BY Projekt.ProjNr,
             Bstlagerbuchung.KoArt

    ...

    wird durch die WHERE-Klausel nicht wieder alles rausgeworfen, was hier nicht gewollt ist?

    Auch dürfte es bei der KoArt keine NULLs geben auf der Ebene. Wenn, dann müsste das doch in eine HAVING-Klausel, oder bin ich hier so "gejetlaged"?

    Meinem Verständnis der Frage nach, muss man die originale Abfrage einfach mit einem CASE-Statement anreichern, wie oben angedeutet..

    Ah, hat sich doch schon erledigt. Na wunderbar.


    Andreas Wolter | Microsoft Certified Master SQL Server

    Blog: www.insidesql.org/blogs/andreaswolter
    Web: www.andreas-wolter.com | www.SarpedonQualityLab.com


    Montag, 14. Oktober 2013 19:20