Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] MySQL Berechnung innnerhalb eines Feldes

Einklappen

Neue Werbung 2019

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

  • [Erledigt] MySQL Berechnung innnerhalb eines Feldes

    Hallo Forum,

    ich habe eine Tabelle, in der es u.a. ein Feld mit Preisen gibt:

    id Preis
    1 10€
    2 11€
    3 13€

    Dabei handelt es sich um eine Zeitreihe und ich möchte jetzt die relative Veränderung des Preises über die Zeit in MySQL berechnen und in ein neues Feld schreiben, also ungefähr so:

    id Preis Veränderung
    1 10€ NULL
    2 11€ 0,1
    3 13€ 0,18


    Dabei stehe ich zum einen vor folgenden Problemen:

    * Berechnung der Veränderung in MySQL (Berechnung von Spalten ist mir klar, aber wie funktioniert das zwischen zwei Zeilen?)
    * berechneten Wert mittels UPDATE TABLE in die Tabelle schreiben (es handelt sich hierbei um eine verschachtelte Abfragen und ich weiß nicht genau, wie die Abfrage dann aussieht)

    Falls ein weiteres Feld oder auch Tabelle nötig ist, kann ich dieses anlegen.

    Ich habe schon Google und Co bemüht, bin aber leider erfolglos gewesen

    Kann mir jemand weiterhelfen?

    Vielen Dank und viele Grüße

    Aldaris

  • #2
    Statistische Werte wie Preisdifferenzen zum "Vorgänger" in eine Datenbank zu speichern halte ich für unklug. Wann auch immer der Vorheriger Eintrag einer Selektion bearbeitet wird, muss dieser Wert überarbeitet werden. Sollte man also solche Informationen benötigen, Selektiert man sie einfach. Grad bei Preislisten die eine Zeitlinie abbilden solltest du eher den Änderungs / Einfügungszeitpunkt speichern ( nachdem du dann auch strikt selektieren kannst ), als Wertdifferenzen zwischen 2 Einträgen.

    Festzustellen wieviel Preisunterschied der aktuelle Wert zum chronologisch davor liegenden Eintrag macht ist dann eher eine Sache von einem Query das ein Subquery zum holen des Vorwertes nutzt.

    Code:
    SELECT ( SUM(wertSpalte) - ( wertSpalte * 2 ) ) as differenz 
       FROM tabelle WHERE chronoSpalte IN ( targetWert, -- sub select auf davoliegenden wert -- );
    Da sich bei bestimmten Designs natürlich chronologische Werte auch mehrfach in der Datenbank befinden sollte man Alternativ auch 2 Sub-SELECTs nutzen die die IDs zweier rows spezifizieren., entsprechend IN( sub-select, sub-select ).

    Der Umstand relativiert sich, im bequemsten Fall kannst du auch 2 Rows sortiert nach deren chronologischem Index abholen und dessen differenz sprachmethodisch auswerten ( in PHP oder wo auch immer ).

    Kommentar


    • #3
      Hallo tr0y,

      vielen Dank für Deine schnelle Hilfe!

      So ganz habe ich allerdings noch nicht verstanden, wie genau der Code funktioniert. Du hast vollkommen Recht, dass es sinnvoll ist, eine Datumsspalte einzubauen. Ich wollte das auch mit einem Query umsetzen, die Problematik mit der Änderung der Preise wäre damit auch gelöst.

      Die Tabelle habe ich entsprechend umgebaut, sie sieht jetzt so aus:
      Code:
      Produkt   Preis   Datum
      A           10€     2011-01-01
      A           11€     2011-01-02 
      A           13€     2011-01-03

      Ich habe jetzt folgenden Code daraus gemacht, bekomme aber nur eine Wert und keine Liste zurück - wahrscheinlich steckt dort noch ein Fehler drin, die Anpassung für unterschiediche Produkte fehlt auch noch (das ist erstmal nicht so wichtig, da nur ein Produkt in der Datenbank vorhanden ist):

      Code:
      SELECT (
      SUM( Preis ) - ( Preis *2 ) ) AS difference
      FROM tabelle WHERE Datum IN (Datum, Datum -1);
      Was muss ich genau im Code anpassen, um die Differenz zum Vortag für ein bestimmtes Produkt zu bekommen? Die Query soll die komplette Tabelle durchgehnen und dabei die Preisabweichungen für alle Tage berechnen.

      Viele Grüße

      Aldaris

      Kommentar


      • #4
        Code:
        SELECT (
        SUM( Preis ) - ( Preis * 2 )
        ) AS difference
        FROM tabelle
        WHERE Produkt = <--- insert produkt ---> AND Datum IN (
           CAST(<--- date des Tages einfügen ---> AS DATE),
           SUBDATE( CAST(<--- date des Tages einfügen ---> AS DATE) ,1)
        );
        ungetestet.

        http://dev.mysql.com/doc/refman/5.5/...nction_subdate

        Kommentar


        • #5
          Hallo tr0y,

          vielen Dank für den Code, das Ergebnis ist schonmal richtig, den Code habe ich noch etwas modifiziert:

          Code:
          SELECT (
          (SUM( Preis ) - ( Preis * 2 )) / Preis
          ) AS difference
          FROM tabelle
          WHERE Produkt = "A" AND Datum IN (
             CAST("2011-01-02" AS DATE),
             SUBDATE( CAST(""2011-01-02"" AS DATE), 1)
          );
          Ich suche nun nur noch eine Möglichkeit, dass ich die Berechnung nicht für jeden einzelnen Tag händisch machen muss, sondern eine allgemeine Funktion habe, die die Berechnung in einem Rutsch durchführt. Also quasi die Query, die mir dann die Liste mit den relativen Abweichungen ausgibt.

          Hast Du vielleicht eine Idee, wie ich das Problem lösen kann?

          Viele Grüße

          Aldaris

          Kommentar


          • #6
            Theoretisch so:

            Code:
            SELECT
              h.produkt,
              h.datum,
              (((h.preis+v.preis) - (h.preis*2))/h.Preis) AS difference
            FROM
              tabelle h LEFT JOIN tabelle v
                ON h.produkt=v.produkt
                  AND h.datum=v.datum + INTERVAL 1 DAY
            ORDER BY
              h.produkt ASC,
              h.datum ASC
            Gruß Jens

            Kommentar


            • #7
              Hi Jens,

              vielen Dank, das funktioniert einwandfrei

              Viele Grüße

              Aldaris

              Kommentar

              Lädt...
              X