php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.10.2011, 16:34  
Neuer Benutzer
 
Registriert seit: 10.10.2011
Beiträge: 13
PHP-Kenntnisse:
Anfänger
Aldaris befindet sich auf einem aufstrebenden Ast
Standard [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
Aldaris ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 10.10.2011, 17:51  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.856
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

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 ).
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 10.10.2011, 18:48  
Neuer Benutzer
 
Registriert seit: 10.10.2011
Beiträge: 13
PHP-Kenntnisse:
Anfänger
Aldaris befindet sich auf einem aufstrebenden Ast
Standard

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

Geändert von Aldaris (10.10.2011 um 18:50 Uhr). Grund: Fehlerkorrektur
Aldaris ist offline   Mit Zitat antworten
Alt 10.10.2011, 19:02  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.856
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

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
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 10.10.2011, 19:44  
Neuer Benutzer
 
Registriert seit: 10.10.2011
Beiträge: 13
PHP-Kenntnisse:
Anfänger
Aldaris befindet sich auf einem aufstrebenden Ast
Standard

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
Aldaris ist offline   Mit Zitat antworten
Alt 11.10.2011, 13:44  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

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
Jens Clasen ist offline   Mit Zitat antworten
Alt 11.10.2011, 13:52  
Neuer Benutzer
 
Registriert seit: 10.10.2011
Beiträge: 13
PHP-Kenntnisse:
Anfänger
Aldaris befindet sich auf einem aufstrebenden Ast
Standard

Hi Jens,

vielen Dank, das funktioniert einwandfrei

Viele Grüße

Aldaris
Aldaris ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mysql funktioniert nicht (Erweiterung nicht erkannt!?) pfump Server, Hosting und Workstations 10 17.03.2012 11:07
PHP Zugriff auf MySQL Community Server gewähren daemonTutorials Datenbanken 8 21.02.2011 12:28
MySQL Datentransfer (Dateigroesse 4MB) via Shell Zugang oder einfacher promoterlv Datenbanken 1 14.11.2010 22:12
[Erledigt] PHP bekommt keine Verbindung zu MySQL SaKe Datenbanken 15 20.09.2010 14:45
Mysql fehler bei externen Zugriff SteiniKeule Datenbanken 4 18.06.2010 12:54
PDO MySQL abfrage funktioniert nicht Bloodydead PHP Tipps 2010 8 18.06.2010 11:08
Erkenntnisse aus der MySQL -> Oracle migration Donald Datenbanken 9 13.04.2010 14:24
[Erledigt] MySQL Link Resource in einer statischen Variablen speichern Lenki PHP-Fortgeschrittene 8 18.03.2010 16:37
Berechnung über mehrere Abfragen aus mysql Slappi PHP Tipps 2008 2 18.12.2007 14:22
Mysql Server Einstellunen Optimieren pchero Datenbanken 3 01.05.2007 19:50
MySQL Server startet nicht mehr richtig... Datenbanken 16 03.03.2006 19:40
Berechnung in mysql Datenbanken 4 19.09.2005 06:47
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
MYSQL läuft nur wenn /tmp auf 777 Datenbanken 5 06.07.2005 08:38
mysql root passwort vergessen Datenbanken 1 29.05.2005 11:33

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php sql veränderung zum vorwert, mysql berechnung, berechnen mysql, php sql preis änderung vortag, werte chronologisch speichern mysql, mysql statement tage differenz berechnen, php mysql berechnung, myysql alle zeilen einer tabelle berechnen und update, mysql berechnung zwei zeilen, mysql berechnung select felder, mysql berechnung aus spalten, durchschnittspreis und dann differenz berechnen mysql, mysql berechnen zwischen zwei zeilen, errechnen und neu selektieren mysql, mysql select rechnen zeilen, php mysql berechnen mehrere tabellen, mysql on update berechnung, in mysql rechnen, mysql berechnungen, berechnung in mysql datenbank 2011

Alle Zeitangaben in WEZ +2. Es ist jetzt 14:52 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum