Jump to content

SQL Abfrage OHNE Ergebnis


Direkt zur Lösung Gelöst von MDD,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

 

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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

Link zu diesem Kommentar
  • Beste Lösung
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 von MDD
Link zu diesem Kommentar

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 von MDD
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...