Jonas: Frage zu MYSQL Query - kann man das optimieren?

Hallo,
arbeite mit MySql Datenbank und Php und habe eine Frage zur Optimierung von Abfragen. Ich möchte gerne eine Umsatzauswertung machen und wollte wissen, wie ich diese mit möglichst wenig Abfragen umsetzten kann.

Momentan habe ich 12 Abfragen und hoffe, dass das besser geht (wüsste aber nicht wie):
1. Abfrage
Gesamtumsatz der Firma (sum), Anzahl der Abschlüsse (count), Durchschnittlicher Abschluß (avg) im Jahr x (where Year=x)
2. Abfrage
Gesamtumsatz der Firma (sum), Anzahl der Abschlüsse (count), Durchschnittlicher Abschluß (avg) für alle Jahre (ohne where)
3. Abfrage (es geht bei dieser Auswertung nur um einen Mitarbeiter (mich;-), obwohl die Firma mehrere Mitarbeiter hat
Gesamtumsatz des Mitarbeiter (sum), Anzahl der Abschlüsse (count), Durchschnittlicher Abschluß (avg) im Jahr x (where Mitarbeiter=1 && Year=x)
4. Abfrage
Gesamtumsatz des Mitarbeiter (sum), Anzahl der Abschlüsse (count), Durchschnittlicher Abschluß (avg) (where Mitarbeiter=1)

Soweit so gut, aber ich möchte diese Auswertung nicht nur für die Gesamtumsätze haben, sondern auch noch für alle Produkte einzeln (Produktanzahl ca 15) (Group By Produkt_ID):
Gesamt für Produkt 1, Durchschnittlicher Preis Produkt 1, Anzahl Verkäufe Produkt 1, jeweils für Jahr und Gesamt und jeweils für Mitarbeiter 1 und Gesamtfirma

Und dann das ganze auch noch für die jeweiligen Kunden (hier kommen ca. 200 potenzielle Kunden in Betracht) (Group By Kunden_ID) auch hier wieder Jahr und Gesamt und Mitarbeiter und Gesamt

Nach diesen Abfragen schreibe ich die Ergebnisse in eine Tabelle und werte zusätzlich das Verhältnis von meinen Ergebnissen und Firmenwerten (x% des Gesamtumsatzes, y% der Abschlüsse für Jahr und Gesamt)  bzw. das Verhältnis  der Produkte bzw. Kunden zum jeweiligen (meinen und Firmen) Gesamtumsatz (hier das ganze natürlich in Wertigkeit sortiert)

Kann man diese 12 Abfragen nicht irgendwie sinnvoll zusammenfassen (besonders da ja durch die Ausgabe in eine Tabelle die Abfragen ja auch noch sinnvolle geschachtelt werden müssen.....) Oder ist das eine schöne Utopie?
Kann man z.B. alle Abfragen die auf das Jahr bezogen sind in einer Abfrage zusammenfassen, bzw. alle Abfragen die auf den Mitarbeiter bezogen sind?

In der Hoffnung, daß ich mich einigermaßen klar ausgedrückt habe und für jede Hilfe dankbar,
Jonas

  1. Hi,

    arbeite mit MySql Datenbank und Php

    dann ist PHP also eine mögliche Stelle für nachstehende Programmlogik.

    Gesamtumsatz der Firma (sum), Anzahl der Abschlüsse (count), Durchschnittlicher Abschluß (avg) im Jahr x (where Year=x)
    Gesamtumsatz der Firma (sum), Anzahl der Abschlüsse (count), Durchschnittlicher Abschluß (avg) für alle Jahre (ohne where)

    Ich sehe hier im Hinblick auf PHP eine Vereinigungsmöglichkeit.

    Gesamtumsatz des Mitarbeiter (sum), Anzahl der Abschlüsse (count), Durchschnittlicher Abschluß (avg) im Jahr x (where Mitarbeiter=1 && Year=x)
    Gesamtumsatz des Mitarbeiter (sum), Anzahl der Abschlüsse (count), Durchschnittlicher Abschluß (avg) (where Mitarbeiter=1)

    Dito. Macht zwei Abfragen und ein wenig PHP-Logik. Sobald es um mehr als, sagen wir, hundert Jahre geht, könnten sich vier einzelne Abfragen lohnen ;-)

    Soweit so gut, aber [...] (Group By Produkt_ID)

    Bei ~15 Produkten kannst Du auch das noch in obige Logik einbringen. Immer noch nur zwei Abfragen.

    (Group By Kunden_ID)

    Hm, mit ~200 müsste das schon ausgetestet werden, was mehr Ressourcen schluckt. Dies würde ich eher noch mal separat sehen.

    Kann man diese 12 Abfragen nicht irgendwie sinnvoll zusammenfassen

    Günstig gruppieren und daran denken, dass auch PHP addieren kann.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo Cheatah,
      erstmal danke für den Denkanstoss!
      Wie sähe das dann aus?
      In etwa so?:
      $summe=0;
      $summe_jahr=0;
      $summe_mi=0;
      $summe_mi_jahr=0;
      $summe_pr=0;
      $summe_pr_jahr=0;
      $summe_ku=0;
      $summe_ku_jahr=0;
      $anzahl_jahr=0;
      $anzahl_mi=0;
      $anzahl_mi_jahr=0;
      $anzahl_pr=0;
      $anzahl_pr_jahr=0;
      $anzahl_ku=0;
      $anzahl_ku_jahr=0;

      $sql="select Preis, Produkt_ID, Mitarbeiter_ID, Kunden_ID, Jahr from Tabelle";
      $erg=mysql_query($sql);
      $anzahl=mysql_num_rows($erg); //-- Anzahl der Verkäufe gesamt
      while ($Aus = mysql_fetch_array($erg))
      {
      $summe=($summe+$Aus["Preis"]);//--Gesamtumsatz
      if $Aus["Jahr"]="2003"
        {
        $summe_jahr=($summe_jahr+Aus["Preis"]);//--Gesamtumsatz im
        gewählten Jahr
        $anzahl_jahr=($anzahl+1);//-- Gesamtanzahl der Verkäufe im Jahr
        }
      if $Aus["Mitarbeiter_ID"]="2"
        {
        $summe_mi=($summe_mi+$Aus["Preis"]);
        $anzahl_mi=($anzahl_mi+1);
        if $Aus["Jahr"]="2003"
          {
          $summe_mi_jahr=($summe_mi_jahr+$Aus["Preis"]);
          etc.
          }
        }
      }

      soweit so schön, aber wie bekomme ich das mit den Produkten und Kunden hin? Da weiß ich ja nicht wieviele es tatsächlich sind (bei Produkten geht das ja noch, aber bei Kunden kann immer mal wieder einer dazu kommen.....

      Oder ist das ganze da oben viel zu einfach (oder einfallslos) gedacht?

      Danke,
      Jonas

      1. Hi,

        In etwa so?:
        $summe=0;
        $summe_jahr=0;

        [...]

        na, ich würde eher die einzelnen Zahlen in assoziative Arrays (Key: Jahreszahl) schreiben und anschließend $array[$dieses_jahr] sowie eine geschickt erzeugte Summe ermitteln. Das hält auch die DB-Verbindung nicht so lange künstlich offen. Aber grundsätzlich hast Du glaube ich verstanden, worauf ich hinauswollte.

        soweit so schön, aber wie bekomme ich das mit den Produkten und Kunden hin?

        Ähnlich ;-)

        Da weiß ich ja nicht wieviele es tatsächlich sind

        Weißt Du es bei den Jahren?

        (bei Produkten geht das ja noch, aber bei Kunden kann immer mal wieder einer dazu kommen.....

        Bei Produkten auch, hoffe ich.

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. wie bekomme ich das mit den Produkten und Kunden hin?

          Ähnlich ;-)

          Danke;-)

          Weißt Du es bei den Jahren?

          Ja, weil zumindest bis auf weiteres nur das aktuelle Jahr mit dem Gesamtumsatz verglichen werden soll,.. wobei eine Aufschlüsselung nach einzelnen Jahren natürlich auch sehr sinnvoll ist

          Bei Produkten auch, hoffe ich.

          Ja, aber das ist überschaubar und könnte notfalls manuell zu bearbeiten.....

          Grüße,
          Jonas

          1. Hi,

            Weißt Du es bei den Jahren?
            Ja, weil zumindest bis auf weiteres

            und stopp. Eine Datenbank wird nicht "bis auf weiteres" abgefragt - Dein Konzept hat auch in fünf Jahren noch zu funktionieren, oder wenn irgendwoher die Daten der vergangenen zehn Jahre mit eingefügt werden. Und sag jetzt bitte nicht, die Firma gäbe es erst seit diesem Jahr ;-)

            wobei eine Aufschlüsselung nach einzelnen Jahren natürlich auch sehr sinnvoll ist

            Vielleicht; aber vor allem kannst Du mit dem Brustton der Überzeugung eines behaupten: Die Zahl der Jahre ist verhältnismäßig gering. Es ist nicht wirklich aufwändig, erst mal in einzelne Jahre aufzuteilen und daraus dann zwei Haufen zu machen - nämlich "dieses Jahr" und "Rest".

            Bei Produkten auch, hoffe ich.
            Ja, aber das ist überschaubar und könnte notfalls manuell zu bearbeiten.....

            Auf einmal kommt ein Produkt dazu, welches es in 42 Ausprägungen gibt, die so unterschiedlich sind, dass sie als Einzelprodukte angesehen werden.

            Cheatah

            --
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Hi Cheatah,
              mit dem Faktor Jahr gebe ich Dir absolut recht!!
              Bei dem "Produkt" ist es so, daß es in diesem Fall immer ganz eindeutig definiert ist und niemals in 1, 2 oder mehr Ausprägungen auftreten kann. Und auch die Menge der "Produkte" ist in meinem Fall zwangsläufig beschränkt - es können nur einzelne Produkte wegfallen bzw. (in geringer Zahl) hinzukommen.
              Die ganze Auswertung ist auch kein "offizieller Auftrag", sondern ist nur für mich gedacht um a)mehr über die Möglichkeiten von PHP und MySql zu lernen (ja, ja der Wissensdurst) und b) mir einen genauen Überblick über meine Umsätze (mein Boss urteilt nur nach Umsätzen und nicht nachdem was geleistet wird, wie z.B. die Pflege der Websites, Entwicklung der Datenbank, etc.) in der Firma zu geben um zu sehen an welchen Produkten ich noch intensiver arbeiten muß, und welche Kunden wirklich viel Umsatz bringen und welche nur "labern".... und natürlich die Entwicklungen über die Jahre...und ganz wichtig um meinem Boss gegenüber argumentieren zu können, daß meine Umsätze im Verhältnis zum Gesamtumsatz (trotz der anderen Aufgaben die ich noch übernommen habe(haben mußte...)) in sehr guter Relation stehen (so, genug gejammert...)

              Zumindest werde ich mich heute abend nochmal in mein MySql Buch vertiefen (bin zu MySql und PHP gekommen wie die Jungfrau zum Kinde, und wurstel mich da so durch... für die bisherigen Anwendungen langt es, aber das genügt mir nicht) - wenn Du eine gute Empfehlung für ein PHP-Buch/Tutorial o.ä. hast wäre ich dankbar. Bei MySql bin ich z.B. sehr zufrieden mit dem Buch von Paul DuBois (ist leicht verständlich, hat nachvollziehbare Beispiele, und ist meiner Meinung nach fundiert).
              Wo ich z.B. ganz konkret Probleme habe ist das assoz. Array. Wenn ich selber eins bestimme (nur PHP), ok, wenn ich Daten aus der Datenbank auslese und mit einfacher while Schleife verarbeite ok. Aber sobald es darüber hinausgeht: "Böhmische Dörfer"

              Naja, schönen Abend noch,
              Jonas