Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Ergebnisse mit "0" anzeigen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Hoppel, 15 April 2016.

  1. Hoppel

    Hoppel Aktiver Benutzer

    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?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. Hoppel

    Hoppel Aktiver Benutzer

    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: 15 April 2016
  4. akretschmer

    akretschmer Datenbank-Guru

    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=*#
    
     
  5. Hoppel

    Hoppel Aktiver Benutzer

    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.
     
  6. ukulele

    ukulele Datenbank-Guru

    Was du machst entspricht einem INNER JOIN, du suchst aber einen LEFT JOIN.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    yepp. ist besser, den join expliziet zu definieren.
     
  8. Hoppel

    Hoppel Aktiver Benutzer

    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?
     
  9. ukulele

    ukulele Datenbank-Guru

    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
     
  10. Hoppel

    Hoppel Aktiver Benutzer

    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')
     
  11. ukulele

    ukulele Datenbank-Guru

    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' )
     
  12. Hoppel

    Hoppel Aktiver Benutzer

    Danke das Statement funktioniert, das du gepostet hast! Lag es an dem Datum? Ich sehe sonst keinen Unterschied.
     
  13. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden