Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-Abfrage ob ein Einzelpreis NULL ist (https://www.delphipraxis.net/180597-sql-abfrage-ob-ein-einzelpreis-null-ist.html)

HolgerCW 2. Jun 2014 10:47

Datenbank: Oracle • Version: 10 • Zugriff über: BDE

SQL-Abfrage ob ein Einzelpreis NULL ist
 
Hallo zusammen,

ich habe eine komplexe SQL-Abfrage:

Delphi-Quellcode:
SELECT DISTINCT LB.PROJEKTNUMMER, LB.BUCHUNGSART_ID, BA.BUCHUNGSART, BA.PLUSMINUS, BA.FIRMA, LB.BEARBEITUNG, LB.LIEFERSCHEINNR,
SUM(LB.STUECK * LB.PREIS) AS PREIS
FROM SYSSIGMA2GML.LAGERBESTANDSBUCHUNG LB
LEFT JOIN SYSSIGMA2GML.BUCHUNGSART BA
ON LB.BUCHUNGSART_ID = BA.ID
LEFT JOIN SYSSIGMA2GML.LAGERSTAMM LS
ON LB.LAGERNUMMER = LS.LAGERNUMMER
LEFT JOIN SYSFORM.KOBUSYS_SAPMATERIAL SAP
ON LB.MATERIALNUMMER = SAP.MATERIALNUMMER
LEFT JOIN SYSFORM.KOBUSYS_VERBRAUCHSMATERIAL VER
ON LB.MATERIALNUMMER = VER.MATERIALNUMMER
WHERE LB.ID IS NOT NULL AND LS.HAUPTLAGERKENNZEICHEN = '1' AND LB.SAP_UEBERGABE IS NULL AND TRANSLATE(LB.MATERIALNUMMER,' 0123456789', '#') is null
GROUP BY LB.PROJEKTNUMMER, LB.BUCHUNGSART_ID, BA.BUCHUNGSART, BA.PLUSMINUS, BA.FIRMA, LB.BEARBEITUNG, LB.LIEFERSCHEINNR
HAVING 1 = 1
ORDER BY LB.PROJEKTNUMMER
Nun würde ich gerne den ausgegebenen Datensatz, welcher bei der Berechnung der Summe einen Einzelpreis mit 0 oder NULL hatte gerne kennzeichnen.

Wie kann ich das SQL-technisch ermitteln ?

Gruss

Holger

jobo 2. Jun 2014 10:57

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Bei einem Number Typ der Basisspalte könntest Du so eine berechnete Spalte per decode ausgeben:
SQL-Code:
select ... decode(mycolumn, 0, -1, null, -1, 0) as myColumnValueisNull ..
Das gibt bei null oder 0 den Wert -1 aus, sonst 0.
Werte in Anführungszeichen entsprechend für Textspalte bzw. Textausgabe.

himitsu 2. Jun 2014 11:05

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Oder so
SQL-Code:
SUM(NULLIF(LB.STUECK * LB.PREIS, 0)) IS NULL AS HierGabEsEinNullDrin


NULLIF macht aus einer 0 ein NULL, die NULL bleiben NULL
und SUM gibt doch auch NULL zurück, sobald einer der Werte NULL war?

jobo 2. Jun 2014 11:31

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Zitat:

Zitat von himitsu (Beitrag 1261005)
Oder so
SQL-Code:
SUM(NULLIF(LB.STUECK * LB.PREIS, 0)) IS NULL AS HierGabEsEinNullDrin


NULLIF macht aus einer 0 ein NULL, die NULL bleiben NULL
und SUM gibt doch auch NULL zurück, sobald einer der Werte NULL war?

NULLIF(e1, e2) gibt NULL zurück, wenn beide Werte gleich sind, sonst den e1.
NVL(e1,e2) gibt e2 zurück, wenn e1 NULL ist.

himitsu 2. Jun 2014 11:54

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Jupp, das NULLIF gibt somit immer NULL zurück, sobald im ersten Parameter eine 0 oder NULL drin sind, ansonsten den Wert dieses Parameters, da der zweite Parameter ja 0 ist.

Und wenn das SUM nun auch noch NULL liefert, sobald einer der Werte NULL ist, dann liefert IS NULL ein True und somit entspricht das dann der gewünschten Funktion. :angel:

p80286 2. Jun 2014 12:27

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Zitat:

Zitat von himitsu (Beitrag 1261005)
und SUM gibt doch auch NULL zurück, sobald einer der Werte NULL war?

Soweit ich weiß werden NULL-Werte ignoriert.

Somit können selbstgemachte Statistik-Funktionen
Code:
select sum(soldprice) / count(Customer) as Durchschnitt
durchaus in die Hose gehen

so geht's wieder
Code:
select sum(soldprice) / count(Customer) as Durchschnitt
..
where soldprice is not NULL
Gruß
K-H

himitsu 2. Jun 2014 12:34

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Im Postgres weiß ich das Verhalten aktuell nur vom COUNT.
count(Feld) zählt nur Datensätze, wo das Feld nicht NULL ist, während count(*) alle Datensätze zählt.

HolgerCW 2. Jun 2014 12:36

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Hallo zusammen,

dank schon einmal für die Hilfe.

Nur leider klappt das nicht, wenn ich dies in das SQL einbaue:

Delphi-Quellcode:
SUM(NULLIF(LB.STUECK * LB.PREIS, 0)) AS PREIS_NULL
Beispiel:

STUECK PREIS
1 2€
2 0€

Ergebnis aus SUM(LB.STUECK * LB.PREIS) = 2€

Ergebnis aus SUM(NULLIF(LB.STUECK * LB.PREIS, 0)) AS PREIS_NULL auch 2€

Was für Möglichkeiten habe ich noch ?

Gruss

Holger

himitsu 2. Jun 2014 12:48

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Das mit dem COUNT scheint dort genauso zu sein.
http://www.teialehrbuch.de/Kostenlos...unktionen.html

Im Grunde bräuchte man irgendeine Aggregatfunktion, welche NULL liefert, sobald ein NULL in den werten vorkommt.

Funktioniert sowas?
SQL-Code:
COUNT(NULLIF(LB.STUECK * LB.PREIS, 0)) <> COUNT(*) AS PREIS_NULL

Das zweite COUNT zählt alle Datensätze und das erste COUNT zählt alles ohne NULL/0.

oder
SQL-Code:
COUNT(LB.STUECK) + COUNT(LB.PREIS) <> COUNT(*) * 2 AS PREIS_NULL
(beachtet nur NULL, aber keine 0)

jobo 2. Jun 2014 12:49

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
@p80286: Nein, das geht. NULL wird nicht ignoriert, es ist nur undefiniert.
Undefiniert * irgendwas = ebenfalls undefiniert, also NULL.

In die Hose geht das nur, wenn man NULL zu 0 macht und dadurch teilt.

jobo 2. Jun 2014 12:53

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Zitat:

Zitat von HolgerCW (Beitrag 1261023)

Beispiel:

STUECK PREIS
1 2€
2 0€

Ergebnis aus SUM(LB.STUECK * LB.PREIS) = 2€

Ergebnis aus SUM(NULLIF(LB.STUECK * LB.PREIS, 0)) AS PREIS_NULL auch 2€

Äh, was erwartest Du denn da? Ist doch richtig so.
Ich dachte, dass soll in einer extra Spalte geflagt werden.

HolgerCW 2. Jun 2014 13:08

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Wie kann ich das jetzt in mein Select-Statement einbauen ?

HolgerCW 2. Jun 2014 13:10

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
jobo -> Das ist schon richtig. Nur müsste bei der NULLIF - Geschichte doch NULL oder 0 rauskommen, wenn beide das selbe Ergebnis liefern kann ich damit ja ncihts anfangen, oder mache ich was falsch ?

baumina 2. Jun 2014 13:25

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Auch wenn das jetzt zu trivial klingt, aber so wie ich dich verstehe möchtest du das hier:

SQL-Code:
SELECT ....
     , SUM(LB.STUECK * LB.PREIS) AS PREIS
     , DECODE(LB.Preis, NULL, 1,
                        0, 1 ,
                        0) AS PREISISTNULL
....
PREISISTNULL liefert nun für 0 und NULL eine 1, ansonsten eine 0.

HolgerCW 2. Jun 2014 13:33

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
baumina -> Das würde gehen wenn es sich nicht um SUMME der Einzelpreise handeln würde.

Hier haben wir aber eine Gruppierung von Preisen. Nun will ich aus den einzelnen Gruppierungen herrausfinden in welcher der Gruppierung sich bei den Einzelpreisen NULL-Werte befunden haben.

Hat noch wer eine Idee, oder bin ich etwa auf dem Holzweg ...

p80286 2. Jun 2014 13:49

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Zitat:

Zitat von HolgerCW (Beitrag 1261032)
Hier haben wir aber eine Gruppierung von Preisen. Nun will ich aus den einzelnen Gruppierungen herrausfinden in welcher der Gruppierung sich bei den Einzelpreisen NULL-Werte befunden haben.

Das erreichst Du mit
Code:
select * from ...where preis is null
Aber ich vermute stark, daß Du genau das nicht willst.
Versuch doch mal zu beschreiben was Du erreichen willst.

Gruß
K-H

baumina 2. Jun 2014 14:00

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Ah, so langsam verstehe ich. Dann fällt mir eigentlich nur noch ein, dass du ein subselect machst a la:

SQL-Code:
Select .....,
       (Select Count(*) FROM SYSSIGMA2GML.LAGERBESTANDSBUCHUNG XX
         where ((LB.[ID] = XX.ID) and
                ((XX.Preis is null) or (XX.Preis = 0))) AS ANZNULLPREISE

Sir Rufo 2. Jun 2014 14:06

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Zitat:

Zitat von baumina (Beitrag 1261031)
Auch wenn das jetzt zu trivial klingt, aber so wie ich dich verstehe möchtest du das hier:

SQL-Code:
SELECT ....
     , SUM(LB.STUECK * LB.PREIS) AS PREIS
     , DECODE(LB.Preis, NULL, 1,
                        0, 1 ,
                        0) AS PREISISTNULL
....
PREISISTNULL liefert nun für 0 und NULL eine 1, ansonsten eine 0.

Wenn man vor DECODE jetzt noch ein SUM schreiben würde, dann wäre das doch die Lösung :stupid:

HolgerCW 2. Jun 2014 14:12

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Mit einer Unterabfrage habe ich aber dann ja keinen GROUPBY-Ausdruck mehr, aber genau sowas suche ich. Muss nur irgendwie anders gelöst werden.
Da ich ja in die Hauptabfrage nicht die ID mit reinbringen kann, da er mir dann ja die Daten nicht mehr gruppieren würde.

Was gibt es noch ?

HolgerCW 2. Jun 2014 14:17

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Sir Rufo -> DAS IST DIE LÖSUNG. DANKE !!!

Hier noch erweitert für NULL, 0 und 1:

Delphi-Quellcode:
SUM(DECODE(LB.PREIS, NULL, 1, 0, 1 , 0)) AS PREIS_0,
SUM(DECODE(LB.PREIS, NULL, 1, 1, 1 , 0)) AS PREIS_1,
SUM(DECODE(LB.PREIS, NULL, 1, NULL, 1 , 0)) AS PREIS_NULL

Sir Rufo 2. Jun 2014 14:19

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Zitat:

Zitat von HolgerCW (Beitrag 1261048)
Sir Rufo -> DAS IST DIE LÖSUNG. DANKE !!!

Hier noch erweitert für NULL, 0 und 1:

Delphi-Quellcode:
SUM(DECODE(LB.PREIS, NULL, 1, 0, 1 , 0)) AS PREIS_0,
SUM(DECODE(LB.PREIS, NULL, 1, 1, 1 , 0)) AS PREIS_1,
SUM(DECODE(LB.PREIS, NULL, 1, NULL, 1 , 0)) AS PREIS_NULL

Die Lösung ist von baumina, ich hab nur noch die Schleife zugebunden :)

baumina 2. Jun 2014 14:22

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Zusammen sind wir stark ! :thumb:

HolgerCW 2. Jun 2014 14:30

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Vielen dank an Euch alle.

Gruss

Holger

Jumpy 2. Jun 2014 15:31

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Zitat:

Zitat von HolgerCW (Beitrag 1261048)
Sir Rufo -> DAS IST DIE LÖSUNG. DANKE !!!

Hier noch erweitert für NULL, 0 und 1:

Delphi-Quellcode:
SUM(DECODE(LB.PREIS, NULL, 1, 0, 1 , 0)) AS PREIS_0,
SUM(DECODE(LB.PREIS, NULL, 1, 1, 1 , 0)) AS PREIS_1,
SUM(DECODE(LB.PREIS, NULL, 1, NULL, 1 , 0)) AS PREIS_NULL

Obwohl sich mir die letzte Zeile noch nicht so ganz erschlossen hat, hätte nicht genügt:
SUM(DECODE(LB.PREIS, NULL, 1, 0)) AS PREIS_NULL

jobo 2. Jun 2014 16:28

AW: SQL-Abfrage ob ein Einzelpreis NULL ist
 
Wer hats gemacht? Die Schweizer..
Also das Decode habe ich im #2 geschrieben, nur mit -1, dass es in einem Group statement mit aggregiert werden muss, sollte eigentlich klar sein, oder?
:)

Aber da will ich nicht drauf rumreiten, sondern anmerken, dass die Aggregatform mit SUM fragwürdig oder unsicher ist. Besonders wenn ich mich bei ein paar Beispieldaten drauf einschieße, dass da immer 0 oder 1 rauskommt.
Es könnte auch mehr werden, ein min/max wäre also vielleicht die bessere Wahl, jenachdem was man braucht, Hauptsache, man weiß, was man tut.

@Jumpy: Ja


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:59 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