Ergebnisse mit "0" anzeigen

Hoppel

Aktiver Benutzer
Beiträge
38
Hallo,

ich habe folgende SQL-Abfrage:

Code:
select b.Artikelnummer, SUM(b.menge) as Absatzmenge, count(distinct b.adressnummer) as AnzahlKunden, ROUND(SUM(b.Menge*b.Einzelpreis),2) as Umsatz,
ROUND(SUM((b.Einzelpreis*b.Menge)-(a.EinkaufsPreis*b.Menge)),2) as Nettogewinn
from Bestellungen b, artikel a
where convert(date,b.datum) >='01.01.2016' and  convert(date,b.datum) < '01.01.2017' and a.Artikelnummer = b.Artikelnummer
group by b.Artikelnummer
having ROUND(SUM(Menge*Einzelpreis),2)>0
order by b.Artikelnummer

Jetzt möchte ich erreichen, dass die Artikel mir auch die Artikel angezeigt werden, deren Absatzmenge oder Umsatz oder Nettogewinn = 0 ist. Wie schaffe ich das? Habt ihr Ideen/Vorschläge?
 
Werbung:
In Aggregationen werden Werte mit NULL (nicht 0!) nicht berücksichtigt. Willst Du NULL-Werte als 0 mit beachtet haben so könntest Du coalesce(col, 0) verwenden und darüber aggregieren.
 
Wenn ich das hier richtig verstanden habe (SQL - COALESCE Function | 1Keydata), dann muss mindestens ein Spalteneintrag einen Wert haben (in dem Beispiel muss eine Telefonnummer angegeben sein.

Das ist bei mir ja nicht der Fall, da Absatzmenge AnzahlKunden Umsatz und Nettogewinn 0 ist.

Edit:
Code:
select b.Artikelnummer, SUM(ISNULL(b.menge,0)) as Absatzmenge, count(distinct ISNULL(b.adressnummer,0)) as AnzahlKunden, ROUND(SUM(ISNULL(b.Menge,0)*ISNULL(b.Einzelpreis,0)),2) as Umsatz

Das habe ich nun versucht und ISNULL mit coalesce ersetzt. Beides male werden die Artikel nicht angezeigt.
 
Zuletzt bearbeitet:
Code:
test=*# create table hoppel (id int, val int);
CREATE TABLE
test=*# insert into hoppel values (1, 10);
INSERT 0 1
test=*# insert into hoppel values (2, NULL);
INSERT 0 1
test=*# select avg(val) from hoppel ;
  avg   
---------------------
 10.0000000000000000
(1 row)

test=*# select avg(coalesce(val,0)) from hoppel ;
  avg   
--------------------
 5.0000000000000000
(1 row)

test=*#
 
Ich habe das Problem identifiziert:

Ich joine über die beiden Tabellen Artikel und Bestellungen, aber zu manchen Artikeln gibt es keine Bestellungen und daher werden diese Artikel nach dem join nicht angezeigt.

Jetzt habe ich aber keine Idee wie ich mir die Artikel anzeigen lassen kann.
 
Code:
select b.Artikelnummer, ISNULL(SUM(b.menge),0) as Absatzmenge, ISNULL(count(distinct b.adressnummer),0) as AnzahlKunden, ISNULL(ROUND(SUM(b.Menge*b.Einzelpreis),2),0) as Umsatz,
ISNULL(ROUND(SUM((b.Einzelpreis*b.Menge)-(a.EinkaufsPreis*b.Menge)),2),0) as Nettogewinn
from Bestellungen b
LEFT OUTER JOIN  Artikel a ON a.Artikelnummer = b.Artikelnummer
where convert(date,b.datum) >='01.01.2016' and  convert(date,b.datum) < '01.01.2017'  and

Danke für den Hinweis mit dem LEFT JOIN und habe ich mich damit auseinander gesetzt. Jetzt liefert dieses SQL Statement, mir aber immer noch nicht die Artikel, die in der Tabelle "Bestellungen" nicht vor kommen. Was muss ich da noch anpassen?
 
Dein LEFT JOIN ist in deinem Beispiel noch genau falsch herum. Du suchst alle Artikel dann ist Artikel deine Ausgangstabelle und Bestellungen liefern nur (wenn vorhanden) den Umsatz dazu. Gehst du von den Bestellungen aus sind gar keine Artikel bekannt die keine Bestellungen haben.

Außerdem bezieht sich die Einschränkung b.datum natürlich auf Bestellungen, gibt es keine werden auch die anderen Artikel nicht geliefert. Daher muss das aus dem WHERE-Teil mit in die JOIN-Condition.
Code:
select b.Artikelnummer, ISNULL(SUM(b.menge),0) as Absatzmenge, ISNULL(count(distinct b.adressnummer),0) as AnzahlKunden, ISNULL(ROUND(SUM(b.Menge*b.Einzelpreis),2),0) as Umsatz,
ISNULL(ROUND(SUM((b.Einzelpreis*b.Menge)-(a.EinkaufsPreis*b.Menge)),2),0) as Nettogewinn
from Artikel a
LEFT OUTER JOIN Bestellungen b ON a.Artikelnummer = b.Artikelnummer
and convert(date,b.datum) >='01.01.2016' and convert(date,b.datum) < '01.01.2017' where
 
Danke für den Hinweis.

Folgendes Statement zeigt die Artikel leider immer noch nicht an :

Code:
select b.Artikelnummer, ISNULL(SUM(b.menge),0) as Absatzmenge, ISNULL(count(distinct b.adressnummer),0) as AnzahlKunden, ISNULL(ROUND(SUM(b.Menge*b.Einzelpreis),2),0) as Umsatz,
ISNULL(ROUND(SUM((b.Einzelpreis*b.Menge)-(a.EinkaufsPreis*b.Menge)),2),0) as Nettogewinn
from Artikel a
LEFT OUTER JOIN Bestellungen b ON a.Artikelnummer = b.Artikelnummer
and convert(date,b.datum) >='01.01.2016' and convert(date,b.datum) < '01.01.2017' where
a.Artikelnummer in('02-1600HF-E')
 
Kann es sein das sie mit NULL in Spalte 1 gezeigt werden? Dort steht b.Artikelnummer in deiner Variante.
Code:
SELECT   a.Artikelnummer,
     isnull(sum(b.menge),0) AS Absatzmenge,
     isnull(count(DISTINCT b.adressnummer),0) AS AnzahlKunden,
     isnull(round(sum(b.Menge * b.Einzelpreis),2),0) AS Umsatz,
     isnull(round(sum((b.Einzelpreis * b.Menge) - (a.EinkaufsPreis * b.Menge)),2),0) AS Nettogewinn
FROM   Artikel a
LEFT JOIN Bestellungen b
ON     a.Artikelnummer = b.Artikelnummer
AND     convert(DATE,b.datum) BETWEEN '01.01.2016' AND '31.12.2016'
WHERE   a.Artikelnummer IN ( '02-1600HF-E' )
Wenn das nicht geht, liefert das hier überhaupt etwas?
Code:
SELECT   a.Artikelnummer
FROM   Artikel a
WHERE   a.Artikelnummer IN ( '02-1600HF-E' )
 
Werbung:
Ich bin mir nicht sicher, ich würde sagen Spalte 1 muss mit NULL auch in deinem Select aus Post #10 stehen.
Bei a LEFT JOIN b kann a.Artikelnummer einen Wert haben aber b.Artikelnummer NULL sein da ja nicht zwingend etwas zum joinen da ist.

Das mit BETWEEN ist zwar meines erachtens nach eleganter aber anders geht es eigentlich genauso.
 
Zurück
Oben