Announcement

Collapse
No announcement yet.

Totale Summe monatsweise...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Totale Summe monatsweise...

    Hallo,

    ich hoffe, ihr könnt mir helfen...

    Ich habe eine Tabelle, die u.a. die Spalten 'created', die das Erstellungsdatum und eine Spalte 'price' enthält. Ich hätte gern einen SELECT, der mir die totale Summe von 'price' pro Monat ausgibt.

    Bei dem Beispiel hier...

    created | price
    ------------------------
    01.01.2008 | 5.35
    05.01.2008 | 7.43
    12.01.2008 | 14.09
    05.03.2008 | 23.05
    13.03.2008 | 10.11
    02.04.2008 | 1.34
    03.05.2008 | 15.03

    ... soll er z.B. ausgeben:

    01/2008 | 26.87
    02/2008 | 26.87
    03/2008 | 60.03
    04/2008 | 61.37
    05/2008 | 76.4

    Wie ihr seht soll er, nicht wie bei der einfachen Gruppierung, die Summe über den gruppierten Monat ausgeben, sondern die totale Summe pro Monat. Auch sollen alle Monate aufgeführt werden (im Beispiel auch der Februar).

    Ist so etwas überhaupt möglich?

    Vielen Dank im Voraus!

    Gruß!
    93C.

  • #2
    Hallo,

    die einzige Lösung, die mir zu dem Problem spontan einfällt, wäre für jeden Monat eine Abfrage zu schreiben (sind ja nur 12) und diese mit einem UNION ALL zu verbinden. Nicht sehr elegant, aber es müsste funtkionieren.
    "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

    Viele Grüße Novi

    Comment


    • #3
      Hi,

      danke für Deine Antwort, aber so einfach ist es leider nicht, denn es sind nicht nur 12 Abfragen, sondern eben 12 pro Jahr und 'open end'.

      Ich hatte auch schon daran gedacht, mir einfach das älteste und das jüngste Datum abzufragen und mir in PHP die entsprechenden Abfragen zusammenzubauen und die Ergebnisse in PHP so weiter zu verwenden wie ich es brauche... Aber ich hätte eben gern alle Datensätze schon aus einer Abfrage und nicht 100e von Abfragen, deren Ergebnisse noch mit PHP entsprechend verarbeitet werden muss.

      Ich hatte gehofft, MySQL ist mächtig genug um eine entsprechende Abfrage hinzubekommen?!

      Gruß!
      93C.

      Comment


      • #4
        Ich glaube, wenn man erstmal für jeden Montat eine Abfrage macht, könnte man es garantiert so erweitern, dass alle Jahre durchgegangen werden.
        "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

        Viele Grüße Novi

        Comment


        • #5
          select sum(price) from tabelle where date>='01.01.2008' and date<'01.02.2008';

          ergibt die Monatsumme pro Monat und Jahr.

          Comment


          • #6
            mtth,

            Originally posted by mtth View Post
            select sum(price) from tabelle where date>='01.01.2008' and date<'01.02.2008';

            ergibt die Monatsumme pro Monat und Jahr.
            danke auch für Deinen Beitrag, aber Dein SELECT ergibt nur die Monatssumme für den Januar 2008... oder wie hast Du das jetzt gemeint? Ich brauche einen, der mir vom ältesten Eintrag (kein fixes Datum, z.B. 01.01.2008) bis heute (CURRENT_DATE) eine monatliche totale Summe ausgibt (wie ich es oben dargestellt habe) und auch die Monate nicht auslässt, in denen es keine Einträge gab.

            Dieser SELECT bringt z.B. nicht das gewünschte Ergebnis:

            SELECT DATE_FORMAT(created, '%Y/%m') AS created, SUM(price) AS price_tot FROM orders GROUP BY DATE_FORMAT(created, '%Y/%m');

            Das Ergebnis beinhaltet die Monate, in denen es Einträge gab und die Summe geht nur über den gruppierten Monat und nicht als Totale.

            Gruß!
            93C.
            Zuletzt editiert von 93Current; 21.12.2009, 00:18.

            Comment


            • #7
              Das Startdatum(den ältesten Eintrag) und Enddatum(letzter Eintrag) kannst Du ja durch "ORDER BY created" herausfinden.

              Dann kommt es darauf an, wieviele Jahre abgefragt werden. Wenn es bloss 10-20 sind, würde ich mir Abfragen einfach schreiben, also:

              select sum(price) from tabelle where date>='01.01.2008' and date<'01.02.2008';
              select sum(price) from tabelle where date>='01.01.2009' and date<'01.02.2009';
              select sum(price) from tabelle where date>='01.01.2010' and date<'01.02.2010';

              etc.
              Das geht meist schneller, als umständliche SQL -Anweisungen zu lernen.

              Wenn Du Dir vorher eine Jahrestabelle anlegst
              create table years(year int, jan int, feb int,mar int...);
              insert into years values('2008','1','2','3','4','5','6','7','8','9', '10','11','12');


              Kannst Du die Monate füllen mit

              update table years set jan=(select sum(price) from tabelle where date>='01.01.2008' and date<'01.02.2008') where year=2008;
              Zuletzt editiert von mtth; 21.12.2009, 00:53.

              Comment


              • #8
                PS: Diese Datumsumformungen, mit denen das natürlich auch geht, finde ich extrem unpraktisch und nervig.
                Viel besser ist es, für Tag und Monat und Jahr je eine Spalte einzufügen und entsprechend zu nutzen.

                Eine solche inkrementierende Abfrage wie:

                select sum(price) from tabelle where date>='01.01.2010' and date<'01.02.2010';
                select sum(price) from tabelle where date>='01.01.2011' and date<'01.02.2011';


                kannst Du Dir übrigens leicht mit einem Tabellekalkulationsprogramm erstellen (z.B. OpenOffice).
                Zuletzt editiert von mtth; 21.12.2009, 00:57.

                Comment


                • #9
                  mtth,

                  ich weiß schon, was Du meinst... Hmmm...

                  Wieviel Jahre ich abfragen will? Na ja, eigentlich soll es dynamisch funktionieren. Wenn eine extra Tabelle und UPDATES darauf die einzige Lösung ist, werde ich wohl doch die andere Lösung (über PHP) bevorzugen, weil ich bei diesem riesigen Projekt mit unzähligen Tabellen nicht noch eine zusätzliche 'anonyme' Hilfstabelle einbauen möchte. Außerdem wäre es mit der Tabelle nicht getan - ich bräuchte auch noch einen Trigger, der auf einen neuen Eintrag in der Tabelle 'orders' reagiert oder eben ein zusätzliches UPDATE von der PHP-Seite.

                  Die Abfrage soll mir die Datenreihe für eine dynamische Grafik zu quasi statistischen Zwecken liefern also wäre mir, falls es den geben sollte, genau dieser komplizierte SELECT am liebsten - aber diesen gibt es Eurer Meinung (die ich sehr schätze) nach wohl leider doch nicht.

                  Gruß!
                  93C.

                  Comment


                  • #10
                    P.S.:

                    Danke mtth,

                    Originally posted by mtth View Post
                    PS: Diese Datumsumformungen, mit denen das natürlich auch geht, finde ich extrem unpraktisch und nervig.
                    Viel besser ist es, für Tag und Monat und Jahr je eine Spalte einzufügen und entsprechend zu nutzen.

                    Eine solche inkrementierende Abfrage wie:

                    select sum(price) from tabelle where date>='01.01.2010' and date<'01.02.2010';
                    select sum(price) from tabelle where date>='01.01.2011' and date<'01.02.2011';


                    kannst Du Dir übrigens leicht mit einem Tabellekalkulationsprogramm erstellen (z.B. OpenOffice).
                    ich weiß... so etwas habe ich schon oft machen müssen und war froh, dass es diese Möglichkeit gibt, 'ne Menge Tipparbeit zu sparen.

                    Gruß!
                    93C.

                    Comment


                    • #11
                      Wieviele Tabellen sind es denn?

                      Comment


                      • #12
                        Ich arbeite gerade mit 10.000 Tabellen , ist kein Problem für MYSQL

                        Comment


                        • #13
                          Hallo,
                          Originally posted by Novi View Post
                          ...die einzige Lösung, die mir zu dem Problem spontan einfällt, wäre für jeden Monat eine Abfrage zu schreiben (sind ja nur 12) und diese mit einem UNION ALL zu verbinden. Nicht sehr elegant, aber es müsste funtkionieren.
                          naja, ist wirklich nicht sehr elegant und mir fällt dazu noch was Anderes ein .

                          Benötigt wird eine Hilfstabelle für die Monate:
                          [highlight=sql]
                          create table months (month int(2));
                          insert into months values
                          (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12);
                          [/highlight]

                          und eine Servervariable @sum_price zur Bildung der fortlaufenden Summe.

                          [highlight=sql]
                          set @sum_price = 0;

                          select i.grp_date, max(i.price) price
                          from(
                          select if(d.created is null, concat(lpad(m.month, 2, '0'), '/2008'),
                          date_format(d.created, '%m/%Y')) grp_date,
                          @sum_price:=@sum_price+round(ifnull(d.price, 0), 2) price
                          from months m
                          left join daten d on month(d.created) = m.month
                          order by grp_date) i
                          group by i.grp_date;
                          [/highlight]

                          Wenn die Abfrage über mehrere Jahre gehen soll, dann muß evtl. noch eine Hilfstabelle für die Jahre angelegt und diese mit gejoint werden.

                          Gruß Falk
                          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                          Comment


                          • #14
                            Hallo,

                            @mtth:
                            So viele Tabellen sind es bei mir nun auch nicht, mir ging es nur um die Übersichtlichkeit...

                            Aber, und nun folgt ein großes Dankeschön an Falk, wenn auch Du eine Möglichkeit unter Verwendung einer Hilfstabelle hier vorgibst, werde ich dann doch mal diese Variante versuchen und neue Tabellen-Präfixe vergeben (damit ich nächstes Jahr noch weiß, wozu die Hilfstabellen gehören) auch wenn ich schon eine Lösung über PHP habe... Wenn ich durch Einsparung von Abfragen DB-Traffic sparen kann (sind ein paar dynamische Grafiken auf der Statistikseite), soll's mir Recht sein.

                            Vielen Dank für die Hilfe!
                            93C.

                            Comment


                            • #15
                              Originally posted by Falk Prüfer View Post
                              (...)und eine Servervariable @sum_price zur Bildung der fortlaufenden Summe.
                              Sowas hatte ich auch schon überlegt, ich hab es aber irgendwie nicht hin bekommen, da sich die Variable immer erst am Ende der Abfrage also nach den Select verändert hat. Ich mach da wohl was falsch, aber ich hab auch noch nie mit Servervariablen in MySql gearbeitet.

                              Ich werde mir das wohl noch mal angucken müssen.
                              "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

                              Viele Grüße Novi

                              Comment

                              Working...
                              X