![]() |
Datenbank: mysql • Version: 5.5 • Zugriff über: UniDAC
SQL : select mit Fallabfrage
Ich habe folgende SQL-Abfrage:
Code:
Zusätzlich brauche ich : AnzFehlt muss 0 werden, wenn AnzFehlt < 0 ist.
SELECT (coalesce(sum(sl.Anzahl),0) -
coalesce((SELECT sum(lesl.Anzahl) FROM TBLLESL lesl WHERE sl.plmartid=lesl.plmartid AND au.auid=lesl.auid GROUP BY lesl.PLMARTID),0)) AnzFehlt FROM TBLAUPLM au LEFT JOIN TBLPLMAUSL sl ON au.plmauid=sl.plmauid WHERE sl.BuchTyp is NULL AND au.auid=:AUID AND sl.PLMARTID=:PLMARTID GROUP BY sl.PLMARTID Kann ich denn ein IF verwenden ohne den lesl-select 2mal machen zu müssen? Oder wie mach ich das am Besten? *schlauch* |
AW: SQL : brauche Hilfe bei Abfrage
Schreib dir eine STORED FUNCTION die 2 Parameter entgegennimmt und von beiden den Höchstwert zurück liefert ;)
|
AW: SQL : brauche Hilfe bei Abfrage
OK, das hab ich noch nie gemacht. Muss mich da erst mal reinlesen. Aber nur zu meinem Verständis: wenn ich eine solche stored function schreibe und die dann in meinen select-Befehl einbaue, muss ich dann den lesl-select nicht auch 2mal aufrufen?
EDIT: ach ne, habs glaub kapiert. Dann les ich mich mal in die stored functions ... danke nochmal, schönes Wochenende. nochmal EDIT: wäre das nicht das selbe wie GREATEST und ich müsste den lesl-select aber auch 2mal ausrühren? Ich bin wochenendreif und gebs für heute auf. |
AW: SQL : brauche Hilfe bei Abfrage
Die Funktion gibt es schon.
![]() Du kannst ja die Selects verschachteln, der eine Parameter der greatest Funktion wäre einfach die 0. |
AW: SQL : brauche Hilfe bei Abfrage
Ja danke, ich werds am Montag mit GREATEST versuchen, indem ich folgende 2 Werte mitgeb:
1. 0 2. den select das müsst doch klappen. |
AW: SQL : brauche Hilfe bei Abfrage
Zitat:
Zitat:
SQL-Code:
SELECT GREATEST( 0,
(coalesce(sum(sl.Anzahl),0) - coalesce((SELECT sum(lesl.Anzahl) FROM TBLLESL lesl WHERE sl.plmartid=lesl.plmartid AND au.auid=lesl.auid GROUP BY lesl.PLMARTID),0)) ) AnzFehlt FROM TBLAUPLM au LEFT JOIN TBLPLMAUSL sl ON au.plmauid=sl.plmauid WHERE sl.BuchTyp is NULL AND au.auid=:AUID AND sl.PLMARTID=:PLMARTID GROUP BY sl.PLMARTID |
AW: SQL : brauche Hilfe bei Abfrage
Zitat:
;) Und ja, gemeint war, Du >kannst< Selects verschachteln, >musste< aber hier nicht. |
AW: SQL : brauche Hilfe bei Abfrage
Zitat:
Meinen Beitrag habe ich editiert, damit der Bezug klarer wird ;) |
AW: SQL : select mit Fallabfrage
Die Unterabfrage ist nicht sauber:
SQL-Code:
Durch das GROUP BY können potentiell mehrere Datensätze entstehen.
SELECT sum(lesl.Anzahl)
FROM TBLLESL lesl WHERE sl.plmartid=lesl.plmartid AND au.auid=lesl.auid GROUP BY lesl.PLMARTID) Wegen der Verwendung als Unterabfrage ist aber hier nur ein Datensatz erlaubt. Die GROUP BY Klausel muss da weg. |
AW: SQL : select mit Fallabfrage
Zitat:
|
AW: SQL : select mit Fallabfrage
Das da sieht eventuell nach CASE aus. Da lässt sich IF THEN ELSE jedenfalls einsetzen. Stichwort : Kreuztabelle/Pivot-Tabelle.
|
AW: SQL : select mit Fallabfrage
Zitat:
Vereinfacht gesagt wird ohne GROUP BY alles in einen Topf summiert. Mit GROUP BY können mehrere Töpfe (=Datensätze) entstehen wobei jeder Topf seine eigene Teilsumme hat. Beispieltabelle
Code:
Farbe | Preis
================== rot | 5.0 grün | 10.0 blau | 15.0 rot | 22.0
SQL-Code:
SELECT Sum(Preis) FROM Beispieltabelle
-- Ergebnis: 1 Datensatz Inhalt: 52.0
SQL-Code:
Man sieht aber dass diese Ergebnistabelle ziemlich sinnlos ist weil der Bezug zu dem Group-By-Feld verloren gegangen ist.
SELECT Sum(Preis) FROM Beispieltabelle
GROUP BY Farbe -- Ergebnis: 3 Datensätze Inhalt: -- 15.0 -- 10.0 -- 27.0 Deshalb sind die Felder aus der Group-By-Klausel eigentlich immer in der Feldliste enthalten:
SQL-Code:
Würde man jetzt alle diese Teilsummen aufsummieren dann kommt man wieder auf die Gesamtsumme von 52.0.
SELECT Farbe, Sum(Preis) FROM Beispieltabelle
GROUP BY Farbe -- Ergebnis: 3 Datensätze Inhalt: -- blau | 15.0 -- grün | 10.0 -- rot | 27.0 |
AW: SQL : select mit Fallabfrage
Zitat:
|
AW: SQL : select mit Fallabfrage
Gut funktioniert alles. GREATEST hab ich jetzt reingenommen und beide GROUP BY raus. Keine Ahnung warum ich der Meinung war, dass SUM nur mit GROUP BY geht. Aussehen tuts nun so:
SQL-Code:
Danke an euch!
SELECT greatest(coalesce(sum(sl.Anzahl),0) -
coalesce((SELECT sum(lesl.Anzahl) FROM tbllesl lesl WHERE sl.plmartid=lesl.plmartid AND au.auid=lesl.auid),0),0) AnzFehlt FROM tblauplm au LEFT JOIN tblplmausl sl ON au.plmauid=sl.plmauid WHERE sl.BuchTyp is NULL AND au.auid=:AUID AND sl.PLMARTID=:PLMARTID |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz