Benutzer mit den meisten Antworten
SQL Select mit where Klausel

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.ProjNrwhere bstlagerbuchung.koart in
(select bstlagerbuchung.koart from bstlagerbuchung
where
(BstLagerBuchung.KoArt = 90) Or
(BstLagerBuchung.KoArt = 12))
Group By
Projekt.ProjNr, Bstlagerbuchung.KoArt
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
- Bearbeitet Stefan FalzModerator Montag, 14. Oktober 2013 19:13
- Als Antwort markiert turbo_af Montag, 14. Oktober 2013 19:19
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 -
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 -
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
-
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 -
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 -
...
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 -
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
-
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
- Bearbeitet Stefan FalzModerator Montag, 14. Oktober 2013 19:13
- Als Antwort markiert turbo_af Montag, 14. Oktober 2013 19:19
-
...
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
- Bearbeitet Andreas.WolterMicrosoft employee Montag, 14. Oktober 2013 19:21 Update