Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL-Moving Annual Total

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL-Moving Annual Total

    Hi,

    ich muß aus einer MySQL-Tabelle mit Quartals-Umsätzen, das sog. Moving Annual Total (MAT) berechnen.

    Das MAT ist die Summe des vergangen Jahres rückgerechnet ab dem jeweiligen Datenpunkt.

    Die Tabelle sieht vereinfacht ungefähr so aus:

    id, year, quarter, product_group, amount

    Wenn ich jetzt eine Abfrage mache zum Beispiel für

    year IN (2016,2017),
    quarter IN (1,2,3,4)

    soll da zum Schluß folgende Summen bei raus kommen.

    Q1 2016 => Summe Q 2,3,4 2015 + Q 1 2016,
    Q2 2016 => Summe Q 3,4 2015 + Summe Q 1,2 2016,
    Q3 2016 => Summe Q 4 2015 + Summe Q 1,2,3 2016,
    usw.

    also jeweils 1 Jahr zurück.

    Da die Quartale und Jahre jeweils als INT gespeichert sind, denke ich zunächst nicht darüber nach, was hier einem Zeitfunktionen bieten.

    Code:
    SELECT year, quarter, product_group WHERE year IN (2016,2017) AND quarter IN (1,2,3,4) GROUP BY year, quarter, product_goup
    Seht Ihr einen Ansatz wie man das richtig und möglichst direkt abfragt?
    [B]Es ist schon alles gesagt. Nur noch nicht von allen.[/B]

  • #2
    SQL FIDDLE

    Code:
    CREATE TABLE IF NOT EXISTS `quarterresults` (
      `id` int(11) NOT NULL,
      `year` smallint(4) NOT NULL,
      `quarter` tinyint(4) NOT NULL,
      `product_group` varchar(255) NOT NULL,
      `amount` int(11) NOT NULL,
    
      PRIMARY KEY (`id`)
    );
    
    INSERT INTO `quarterresults` (`id`, `year`, `quarter`, `product_group`, `amount`) VALUES
    (1, '2015', '1', 'shoes', 13123),
    (2, '2015', '2', 'shoes', 14234),
    (3, '2015', '3', 'shoes', 12032),
    (4, '2015', '4', 'shoes', 18940),
    (5, '2016', '1', 'shoes', 12480),
    (6, '2016', '2', 'shoes', 13800),
    (7, '2016', '3', 'shoes', 12752),
    (8, '2016', '4', 'shoes', 19411);
    Code:
    SELECT `product_group`, group_concat(`quarter`) AS `Quarter`, concat(year,"/",year+1) AS `Peroid`, sum( `amount` ) AS `12months Result`
    FROM `quarterresults`
    WHERE (year = 2016 AND quarter<=2) OR (year = 2016-1 AND quarter>2)
    Pro Produktgruppe dann in dem du noch ein GROUP BY `product_group`
    hinten dran hängst

    Kommentar


    • #3
      @protestix: Cool, vielen Dank. Habe es noch nicht ganz verstanden, geht aber in eine Richtung, auf die ich selber wohl nie gekommen wäre (zu wenig Ahnung).
      Ich hatte jetzt nicht erwähnt, dass der User frei wählen kann, welche Jahre/Quartale er sehen möchte. Kann also durchaus sein, dass der year IN (2010,2011,2016) und quarter IN (1,3).

      Mal sehen, ob ich da weiter komme.
      [B]Es ist schon alles gesagt. Nur noch nicht von allen.[/B]

      Kommentar


      • #4
        dynamisch machst du es dann so
        PHP-Code:
        $quarter 2;
        $year 2016;  
        $sql 'SELECT `product_group`, group_concat(`quarter`) AS `Quarter`, concat(year,"/",year+1) AS `Peroid`, sum( `amount` ) AS `12months Result` FROM `quarterresults` WHERE (year = ' $year ' AND quarter<=' $quarter ') OR (year = ' $year-' AND quarter>' $quarter ')'

        Kommentar


        • #5
          @protestix: Vielen Dank nochmal für den erweiterten Vorschlag. Muss mich noch etwas reindenken, bringt mich aber in jedem Fall schon ein Stück weiter.
          [B]Es ist schon alles gesagt. Nur noch nicht von allen.[/B]

          Kommentar


          • #6
            Nur damit kein falscher Eindruck entsteht. Ich werde mich konkret damit in ca. 1 Woche auseinandersetzen. Kann also ein bischen dauern, bis ich mich wieder melde.
            [B]Es ist schon alles gesagt. Nur noch nicht von allen.[/B]

            Kommentar

            Lädt...
            X