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

Hochrechnung Absatzzahlen

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

  1. Hoppel

    Hoppel Aktiver Benutzer

    Hallo,

    ich habe folgendes SQL-Statement:

    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,
    ROUND(SUM((ISNULL(b.Einzelpreis,0)*ISNULL(b.Menge,0))-(ISNULL(a.EinkaufsPreis,0)*ISNULL(b.Menge,0))),2) as Nettogewinn
    from Bestellungen b, artikel a
    where convert(date,b.datum) >='01.01.2016' and  convert(date,b.datum) < '01.05.2016' and a.Artikelnummer = b.Artikelnummer and
    a.Artikelnummer in('02-095-E')
    group by b.Artikelnummer
    
    order by b.Artikelnummer
    Nun möchte ich das Statement so erweitern, dass mir eine weitere Spalte angezeigt wird, mit dem Absatz des vergangenen Jahres, wobei als Grundlage die durchschnittliche Absatzmenge benutzt werden soll. Leider fehlen mir die Kenntnisse, das so umzusetzen.

    Habt ihr Ideen?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    ginge u.a mit einem subselect a la 'select ..., (select ...) from ... '

    das in der Klammer ersetzt Du mit dem eigentlichen Select. Gewöhn Dir mal an, JOIN's als solche zu schreiben und nicht Where- und JOIN- - Conditions zu vermengen.
     
  3. Hoppel

    Hoppel Aktiver Benutzer

    Perfekt, das habe ich nun hinbekommen. Mit einer einfachen Aggregat-Funktion avg() komme ich aber noch nicht so weit wie ich möchte. Damit würde ich mir nur die durchschnittliche Absatzzahl für den ganzen Zeitraum (z.B. für vier Monate) ausgeben lassen. Ich möchte aber den monatlichen Durchschnitt.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    dann mußt Du den Monat und das avg() dafür ermitteln und nach dem Monat gruppieren
     
  5. Hoppel

    Hoppel Aktiver Benutzer

    Okay ich habe jetzt für jeden Monat eine Sub-Select gemacht und möchte anschließend den Durchschnitt der vier Monate mir ausgeben lassen. Wenn ich jetzt

    Code:
    (avg(AbsatzmengeJanuar)+avg(AbsatzmengeFebruar)+avg(AbsatzmengeMärz)+avg(AbsatzmengeApril))/4 as Durchschnitt
    probiere, bekomme ich natürlich die Meldung, dass die Spalten nicht bekannt sind. Diese sind ja nur in Sub-Selects "gültig". Irgendwie habe ich mich da gerade verschachtelt.
     
  6. ukulele

    ukulele Datenbank-Guru

    Etwas verwirrend, was genau willst du jetzt berechnen?
    Absatz = Umsatz oder Absatz = Absatzmenge?
    Absatzmenge der letzen 4 Monate, seit dem 01.01. des Jahres oder des Vorjahres?
    Versteif dich nicht auf Subselects pro Monat, das geht sicherlich auch eleganter. Mir ist nur nicht ganz klar was du gegenüber stellst und das muss ja vermutlich auch auf andere Zeiträume anpassbar sein.
     
  7. Hoppel

    Hoppel Aktiver Benutzer

    Absatz = Absatzmenge. Der Umsatz wird separat berechnet.

    Die Absatzmenge der ersten vier Monate des Vorjahres als Vergleich.

    Ich möchte für einen Artikel jeweils die Absatzmenge des aktuellen Zeitraums (01.01.2016 - 30.04-2016), Umsatz und Nettogewinn ermitteln, sowie eine zusätzliche Spalte mit dem durchschnittlichen Absatz des Zeitraums (01.01.2015-30.04.2015) als Vergleichswert. Damit ich sehe wie sich der Absatz positiv/negativ im Vergleich zum letzten Jahr verändert hat.

    Ich hoffe jetzt ist es deutlicher geworden.

    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,
    ROUND(SUM((ISNULL(b.Einzelpreis,0)*ISNULL(b.Menge,0))-(ISNULL(a.EinkaufsPreis,0)*ISNULL(b.Menge,0))),2) as Nettogewinn,
    (select avg(b.menge)
        from Bestellungen b, artikel a
        where convert(date,b.datum) >='01.01.2015' and  convert(date,b.datum) < '01.05.2015' and a.Artikelnummer = b.Artikelnummer and
        a.Artikelnummer in('02-095-E') ) as Absatz2015
    from Bestellungen b, artikel a
    where convert(date,b.datum) >='01.01.2016' and  convert(date,b.datum) < '01.05.2016' and a.Artikelnummer = b.Artikelnummer and
    a.Artikelnummer in('02-095-E')
    group by b.Artikelnummer
    
    order by b.Artikelnummer
    So soll das ganze am Ende aussehen, einzige Problem ist jetzt noch, dass die durchschnittliche Absatzmenge des kompletten Zeitraums genommen wird und ich gerne den Durchschnitt von Absatz Monat Januar bis Absatz Monat April hätte.

    Wenn ich die Sub-Select so verändere:

    Code:
    select avg(b.menge) as Absatz
        from Bestellungen b, artikel a
        where convert(date,b.datum) >='01.01.2015' and  convert(date,b.datum) < '01.05.2015' and a.Artikelnummer = b.Artikelnummer and
        a.Artikelnummer in('02-095-E')
        group by datepart(month, datum)
    bekomme ich zwei Werte für den durchschnittlichen Absatz. Wo liegt mein Denkfehler?
     
    Zuletzt bearbeitet: 29 April 2016
  8. ukulele

    ukulele Datenbank-Guru

    Wiso gruppierst du denn nach datepart(month,datum)? Für den Zeitraum im WHERE-Teil müssten so bis zu vier Durschnittswerte geliefert werden (wenn in jedem Monat ein Umsatz statt gefunden hat). Ich würde sagen das GROUP BY weglassen dann bekommst du den Durchschnitt auf den gesamten Zeitraum.
     
  9. Hoppel

    Hoppel Aktiver Benutzer

    Okay dann mache ich das so. Vielen Dank für die Mühe!
     

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