whirly
Goto Top

MySQL Abfrage artikelbezogener Umsatz pro Jahr ?

Hallo liebe "Helfergemeinde"

Unser Warenwirtschaftssystem basiert auf einer MySQL Datenbank. (5.0.51b)

Da dieses Programm jedoch auswertungstechnisch nicht sehr viel hergibt mache ich viele Spezialauswertungen (Umsatzstatistiken, Lagerstückzahlen,...) im Excel (VBA)

Nun zu meinem Problem .
In der Tabelle "fpositionen" werden alle Artikel aufgeführt die verkauft werden. (Verkaufsdatum-Artikelnummer-Artikelname-Gesamtpreis-Menge)
Das heißt: Jedes mal wenn ein Artikel verkauft wird, wird eine neue Zeile eingefügt. Aus dieser Tabelle möchte ich nun eine Abrfage generieren.

Folgende Abfrage habe ich schon: (vereinfacht auf mein Grundproblem)
SELECT `Artikelname`, SUM(`Gesamtpreis`), SUM(`Menge`)
FROM `mand9`.`fpositionen`
GROUP BY `Artikelnummer`
Das ergibt ja folgendes Abfrageergebnis: Artikelname - Summe des Gesamtpreises - Summe der Menge

Nun möchte ich aber folgendes Abfrageergebnis:
Artikelname - Summe des Gesamtpreises - Summe der Menge - Summe des Gesamtpreises im Jahr 2008 - Summe der Menge im Jahr 2008 - Summe des Gesamtpreises im Jahr 2009 - Summe der Menge im Jahr 2009 - . . .

Mit dem Zusatz in der Abfrage WHERE `Verkaufsdatum` LIKE '2008%' kann ich ja die Abfrage auf ein Jahr beschränken.
Mein Lösungsansatz war: Für jedes Jahr eine eigene Abfrage machen und die Spalten im Excel nebeneinander einfügen. Nun ist dabei aber das Problem dass manche Artikel in einem Jahr nicht verkauft worden sind. Wenn ich jetzt die Abfrageergebnisse in Excel nebeneinander lege und zum Beispiel im Jahr 2009 der Artikel "Schlagmichnich" nicht verkauft worden ist, dann verschieben sich total die Zeilen und es stimmt nichts mehr.

Hat jemand eine Idee wie ich so etwas in eine Abfrage packen könnte?
Vielen Dank.

schöne Grüße
Whirly

Content-Key: 166397

Url: https://administrator.de/contentid/166397

Printed on: April 19, 2024 at 23:04 o'clock

Member: Biber
Biber May 17, 2011 at 09:27:55 (UTC)
Goto Top
Moin Whirly,

in der Regel löse ich Probleme wie das vorliegende mit einer Hilfstabelle ("Zeitdimensionen"), die in der erfordelichen Granularität die auszuwertenden Zeiträume enthält.
Also eine Struktur mit mindestens den Spalten "Jahr", "Quartal", Monat", in die du von Hand oder per Prozedur lückenlos alle Werte von meinetwegen 2008 bis 2025 einträgst.
Gegen diese Tabelle kannst du deine Tabelle (die ja mindestens ein Datumsfeld enthält) mit einem LEFT JOIN oder einem FULL OUTER JOIN verknibbeln.

Grüße
Biber
Member: KUBLIdata
KUBLIdata May 17, 2011 at 11:06:00 (UTC)
Goto Top
Da hilft sicher :
GROUP BY year(Artikeldatum),
die summen sind i.o.
Member: Whirly
Whirly May 26, 2011 at 08:44:05 (UTC)
Goto Top
Hallo Biber,
hallo KUBLIdata,

vielen Dank für eure Antworten.

@ Biber: dein Denkansatz mit der Hilfstabelle ist (glaube ich toll). Jedoch bin ich nicht so fit in Sachen JOIN.
@ KUBLIdata: hab ich kurz ausprobiert. Nur konnte ich das nicht so hinbigen dass ich es gebrauchen könnte.

Ich habe aber die Sache anders gelöst (sagen wir mal so: Sehr unperformant (falls es das Wort gibt))
Ich mache für jeden Artikel und jedes Jahr eine Abfrage. (siehe Code) (nur zur Info)

Sub Artikelumsätze_aktualisieren()

  Sheets("Artikelumsätze").Activate  
  ActiveSheet.Label1.Visible = True   ' "Bitte Warten" einblenden (wird am Ende des Programms wieder ausgeblendet  
    
  Dim zaehler As Integer   'Dieser Zähler wir hochgezählt wenn eine leere Zeile aktualisiert wird. Wenn 4 leere Zeilen hintereinander kommen dann kann man sich sicher sein dass das ende der Liste erreicht worden ist.  
  Dim zeile As Integer
  Dim Artikelnummer As String
  Dim SQLstring(20) As String
  
  zeile = 3
  zaehler = 0
  Do
    Artikelnummer = Range("A" & zeile)  
    If Artikelnummer = "" Then zaehler = zaehler + 1 Else zaehler = 0  
    
  ' Begin mit der ersten Auswertung (Gesamtumsatz,Gesamtmenge)  
    SQLstring(0) = "SELECT SUM(`GP`), SUM(`MENGE`)"  
    SQLstring(1) = "FROM `mand9`.`sg_auf_fpos`, `mand9`.`sg_auf_fschrift`, `mand9`.`sg_auf_artikel`"  
    SQLstring(2) = "WHERE `sg_auf_fpos`.`SG_AUF_FSCHRIFT_1_FK`=`sg_auf_fschrift`.`SG_AUF_FSCHRIFT_PK`"  
    SQLstring(3) = "AND `sg_auf_artikel`.`ARTNR`='" & Artikelnummer & "'"  
    SQLstring(4) = "AND `sg_auf_artikel`.`SG_AUF_ARTIKEL_PK`= `sg_auf_fpos`.`SG_AUF_ARTIKEL_FK`"  
    SQLstring(5) = "AND `ERFART`='04RE'"  
    SQLstring(6) = "AND `sg_auf_fschrift`.`KUNDGR`='Vertreter'"  
    SQLstring(7) = "GROUP BY `sg_auf_fpos`.`SG_AUF_ARTIKEL_FK`"  
    SQLstring(8) = ""  
    
    With ActiveSheet.QueryTables.Add(Connection:="ODBC;DATABASE=mand9;DSN=GS-Abfrage;OPTION=0;PWD=gast;PORT=0;SERVER=server-pu;UID=gast;", Destination:=Cells(zeile, 3))  
        .CommandText = SQLstring(0) & SQLstring(1) & SQLstring(2) & SQLstring(3) & SQLstring(4) & SQLstring(5) & SQLstring(6) & SQLstring(7) & SQLstring(8)
        .Name = ""  
        .FieldNames = False
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlOverwriteCells
        .SavePassword = True
        .SaveData = True
        .AdjustColumnWidth = False
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False
    End With
    Cells(zeile, 3).NumberFormat = "#,##0.00 $"  
    Cells(zeile, 4).NumberFormat = "0"  
    If Cells(zeile, 3).Value = "" And Artikelnummer <> "" Then Cells(zeile, 3).Value = 0  
    If Cells(zeile, 4).Value = "" And Artikelnummer <> "" Then Cells(zeile, 4).Value = 0  
    
    Dim zaehler2 As Integer
    Dim Jahr As Integer
    zaehler2 = 5
    Jahr = Cells(1, zaehler2).Value
    Do
    
      ' Beginn mit der Jahresauswertung (Gesamtumsatz,Gesamtmenge pro Jahr)  
      SQLstring(0) = "SELECT SUM(`GP`), SUM(`MENGE`)"  
      SQLstring(1) = "FROM `mand9`.`sg_auf_fpos`, `mand9`.`sg_auf_fschrift`, `mand9`.`sg_auf_artikel`"  
      SQLstring(2) = "WHERE `sg_auf_fpos`.`SG_AUF_FSCHRIFT_1_FK`=`sg_auf_fschrift`.`SG_AUF_FSCHRIFT_PK`"  
      SQLstring(3) = "AND `sg_auf_artikel`.`ARTNR`='" & Artikelnummer & "'"  
      SQLstring(4) = "AND `sg_auf_artikel`.`SG_AUF_ARTIKEL_PK`= `sg_auf_fpos`.`SG_AUF_ARTIKEL_FK`"  
      SQLstring(5) = "AND `ERFART`='04RE'"  
      SQLstring(6) = "AND `sg_auf_fschrift`.`KUNDGR`='Vertreter'"  
      SQLstring(7) = "AND `sg_auf_fschrift`.`DATUM` LIKE '" & Jahr & "%'"  
      SQLstring(8) = "GROUP BY `sg_auf_fpos`.`SG_AUF_ARTIKEL_FK`"  
    
      With ActiveSheet.QueryTables.Add(Connection:="ODBC;DATABASE=mand9;DSN=GS-Abfrage;OPTION=0;PWD=gast;PORT=0;SERVER=server-pu;UID=gast;", Destination:=Cells(zeile, zaehler2))  
          .CommandText = SQLstring(0) & SQLstring(1) & SQLstring(2) & SQLstring(3) & SQLstring(4) & SQLstring(5) & SQLstring(6) & SQLstring(7) & SQLstring(8)
          .Name = ""  
          .FieldNames = False
          .RowNumbers = False
          .FillAdjacentFormulas = False
          .PreserveFormatting = True
          .RefreshOnFileOpen = False
          .BackgroundQuery = True
          .RefreshStyle = xlOverwriteCells
          .SavePassword = True
          .SaveData = True
          .AdjustColumnWidth = False
          .RefreshPeriod = 0
          .PreserveColumnInfo = True
          .Refresh BackgroundQuery:=False
      End With
      Cells(zeile, zaehler2).NumberFormat = "#,##0.00 $"  
      Cells(zeile, zaehler2 + 1).NumberFormat = "0"  
      If Cells(zeile, zaehler2).Value = "" And Artikelnummer <> "" Then Cells(zeile, zaehler2).Value = 0  
      If Cells(zeile, zaehler2 + 1).Value = "" And Artikelnummer <> "" Then Cells(zeile, zaehler2 + 1).Value = 0  
    
      zaehler2 = zaehler2 + 2
      Jahr = Cells(1, zaehler2).Value
    Loop While Jahr <> 0
    
    zeile = zeile + 1
  Loop While zaehler < 4
  ActiveSheet.Label1.Visible = False     ' "Bitte Warten" wieder ausblenden  
End Sub

liebe Grüße
Whirly

[Edit Biber] Codeformatierung [/Edit]
Member: KUBLIdata
KUBLIdata May 26, 2011 at 08:57:31 (UTC)
Goto Top
Hallo mal eben face-smile

Ich bin hauptberuflicher Datenbankentwickler. Nur werden mir die Fragen und Aufgaben halt etwas anders gestellt.
Ich bin mich gewohnt, dass ich das IST erhalte und das SOLL liefere.
Es ist hier natürlich schwierig, die ganzen Tabellen und Beziehungen abzubilden.
Das "unperformant" (danke für das Wort, finde ich sehr gut formuliert) stimmt natürlich und man könnte sogar böse Worte
wie "Gebastel" dafür verwenden. Nun ja, vor 12 Jahren fing ich auch so an. Das bessert sich laufend mit der Erfahrung.
Auch etwas Literatur (SQL generell) schadet nicht.
Nun ist Ihre Frage damit letztendlich nnicht beantwortet, das weiss ich.
Man hat mich hier schon über meine schweizer Webseite Kublidata . ch kontaktiert, wo ich dann meine Mailadresse
preis gab.
Und sonst: viel Performanz. Ich bin sicher dass Sie das schaffen werden!
Gruss Kudata
Member: Biber
Biber May 26, 2011 at 09:54:03 (UTC)
Goto Top
Moin Whirly,

nein, das Wort "unperformant" gibt es nicht - deine Abfrage ist "inperformant" face-wink

Was an meiner Skizze ist denn unverständlich?
Leg doch mal eine Spieltabelle "zeitdimensionen" an für diese 3 Jahre, füll es mit Daten und poste die Struktur/das CREATE TABLE.

Dann schauen wir weiter - und das hier im Beitrag.

Grüße
Biber