HeikoD 1 Geschrieben 1. August 2022 Melden Teilen Geschrieben 1. August 2022 Hallo Forum, seit Tagen sitze ich vor einem Problem und bin am Verzweifeln. Ich muss eine Abfrage schreiben, die kein Ergebnis bringt wenn zwei Prüfkriterien erfüllt sind - das ERP System im Hintergrund hat da leider so seine Eigenheiten. Der Vorgang ist wie folgt. Ich habe N Positionen eines Auftrages und der muss auf Gesamtwert und Marge der Positionen geprüft werden. Ist der Gesamtwert über 5.000 und/oder die Marge auch nur einer Position < 10 muss der Auftrag in eine Prüfung. Die Routine, die diesen Auftrag in die Prüfung schickt will aber, dass die Abfrage KEINE Ergebnismenge bringt - Das ERP betrachtet ein Selektionsergebnis als nicht freigabewürdigen Auftrag. Das Problem ist: Prüfe ich auf WERT> 5.000 bekomme ich ein Ergebnis, als auch wenn ich auf die zu geringe Marge prüfe. Jedenfalls dann, wenn der Auftrag entsprechend aussieht. Hier mal die Daten eines exempl. Auftrags: BLANKET_ORDER_GUID, MARGE, AUFTRAGSNUMMER, WERT 1ba82930-0e63-11ed-aea3-c8977038ceca, -882.300000, RA2022202724, 9252.750000 1ba82930-0e63-11ed-aea3-c8977038ceca, 12.951142, RA2022202724, 9252.750000 1ba82930-0e63-11ed-aea3-c8977038ceca, 34.427133, RA2022202724, 9252.750000 Dieser Auftrag verletzt beide Regeln, er ist über 5.000€ Wert und eine Position hat eine Marge > 10 Nun komme noch etwas hinzu. Das ERP-System akzeptiert nur "SELECTS", keine Cursor. Hat jemand eine Lösung für mich? Gruß Heiko Zitieren Link zu diesem Kommentar
MDD 12 Geschrieben 1. August 2022 Melden Teilen Geschrieben 1. August 2022 SELECT BLANKET_ORDER_GUID FROM Tabelle AS A WHERE NOT EXISTS ( SELECT 'x' FROM Tabelle AS b WHERE a.BLANKET_ORDER_GUID = b.BLANKET_ORDER_GUID AND ( b.wert > 5000 OR b.marge > 10 ) ) Sowas in der Art? Je nachdem on du jetzt die GUID von den Aufträge brauchst die gegen die Regeln verstoßen oder die die nicht dagegen verstoßen musst halt das NOT vor dem EXISTS weglassen. Zitieren Link zu diesem Kommentar
HeikoD 1 Geschrieben 1. August 2022 Autor Melden Teilen Geschrieben 1. August 2022 Hallo MDD, vielen Dank für deine Idee. Leider funktioniert das nicht, oder ich verrstehe dich nicht ... Ich habe den Script mal für mich angepasst. Ich frage einen VIEW ab, den ich im Vorfeld erstellt habe, hier mal ein "Auftrag", der eigentlich ausgegeben werden sollte - weil Marge > 10 und Wert < 5000 Auftragsnummer Marge Wert RA2022202726 98.032814 1450.000000 RA2022202726 79.273000 1450.000000 --- Dieser dürfte nicht selektiert werden, da der Wert zu hoch ist Auftragsnummer Marge Wert RA2022202729 97.270307 5200.000000 Un dieser dürfte ebenfalls nicht selektiert werden - weil eine Postion eine Marge unter 10 hat Auftragsnummer Marge Wert RA2022202728 3.002666 130.000000 RA2022202728 37.960000 130.000000 Wenn ich dich richtig verstanden habe, dann frage ich als A und B denselben View ab, korrekt? DECLARE @anr VARCHAR(30) = 'RA2022202726' -- das dienst mir nur der Erleichterung der Eingabe im Mangement-Studio SELECT BLANKET_ORDER_GUID FROM vi_RA AS A WHERE NOT EXISTS ( SELECT 'x' FROM vi_ra AS b WHERE a.BLANKET_ORDER_GUID = b.BLANKET_ORDER_GUID AND (select sum(summe) from vi_ra where Auftragsnummer = @anr) < 5000 OR b.marge < 10 ) and A.Auftragsnummer = @anr Ich bin echt kurz vor dem Wahnsinn.... Gruß Heiko Zitieren Link zu diesem Kommentar
Beste Lösung MDD 12 Geschrieben 1. August 2022 Beste Lösung Melden Teilen Geschrieben 1. August 2022 (bearbeitet) SELECT BLANKET_ORDER_GUID FROM vi_RA AS A WHERE NOT EXISTS ( SELECT 'x' FROM vi_ra AS b WHERE a.BLANKET_ORDER_GUID = b.BLANKET_ORDER_GUID AND b.marge < 10 ) AND NOT EXISTS ( SELECT summe(wert) FROM vi_ra AS c where a.BLANKET_ORDER_GUID = c.BLANKET_ORDER_GUID group by c.BLANKET_ORDER_GUID having (summe(wert) > 5000 ) Das sollte dir die Guid RA2022202726 zurück liefern aber nicht RA2022202729 oder RA2022202728. bearbeitet 1. August 2022 von MDD Zitieren Link zu diesem Kommentar
HeikoD 1 Geschrieben 1. August 2022 Autor Melden Teilen Geschrieben 1. August 2022 Das probiere ich morgen mal aus - im Moment bin ich zu gefrustet.... Danke und Gruß Heiko Zitieren Link zu diesem Kommentar
HeikoD 1 Geschrieben 2. August 2022 Autor Melden Teilen Geschrieben 2. August 2022 MDD: Du kommst in mein Nachtgebet! VIELEN DANK für den Support 1 Zitieren Link zu diesem Kommentar
MDD 12 Geschrieben 3. August 2022 Melden Teilen Geschrieben 3. August 2022 (bearbeitet) Amen Mir ist noch eine kleine Verbesserung eingefallen die sicher auch performanter ist: SELECT BLANKET_ORDER_GUID FROM vi_RA AS A WHERE NOT EXISTS ( SELECT sum(wert) FROM vi_ra AS b where a.BLANKET_ORDER_GUID = b.BLANKET_ORDER_GUID group by b.BLANKET_ORDER_GUID having sum(wert) > 5000 or min(marge) < 10 ) bearbeitet 3. August 2022 von MDD Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.