AVG() mit Gewichtung?
am 13.05.2006 19:04:17 von Sebastian Suchanek
Hallo NG!
Zu meiner Freude habe ich kürzlich herausgefunden, daß MySQL von
Haus mit AVG() und STD() die Möglichkeit zur rudimentären
statistischen Auswertung von Daten bietet. :-)
Ich habe schon ein wenig damit gebastelt und das funktioniert
auch soweit. Allerdings habe ich dabei folgendes Problem: In
einer Tabelle habe ich nicht nur Preise, die ich auswerten will,
sondern auch die Anzahl, wie oft ein Artikel verkauft wurde[1].
Kann man die Abfrage so gestalten, daß AVG() und STD() die
Anzahl als Gewichtung mit berücksichtigt?
Kleines (unvollständiges) Beispiel:
ID | Preis | Anzahl
---+-------+-------
1 | 5 | 1
2 | 3 | 7
3 | 7 | 1
"SELECT AVG(Preis)" würde ja unkorrekterweise "5" liefern, ich
möchte stattdessen den korrekten Wert "3,666" haben.
Geht das mit MySQL direkt (wenn ja, wie?) oder muß ich die
Auswertung doch auf das "umgebende" PHP-Skript auslagern?
TIA,
Sebastian
PS: Die Datenbank dahingehend umzubauen, daß pro Artikel ein
Datensatz, also ggf. mehrere Datensätze pro Transaktion,
angelegt wird, kommt aus mehreren Gründen nicht in Frage.
_____
Anmerkungen:
[1] Es geht um eBay-Auktionen. Powerauktionen werden eben mit
Preis und Anzahl der verkauften Exemplare gespeichert.
--
http://www.baumaschinen-modelle.net
http://www.schwerlast-rhein-main.de
Re: AVG() mit Gewichtung?
am 13.05.2006 19:49:39 von Sven Paulus
Sebastian Suchanek wrote:
> Geht das mit MySQL direkt (wenn ja, wie?) oder muß ich die=20
> Auswertung doch auf das "umgebende" PHP-Skript auslagern?
Aeh, das ist doch ganz einfach?!
SELECT SUM(Preis*Anzahl)/SUM(Anzahl) FROM xyz
Das ist aber jetzt weniger eine MySQL-Frage ...
Re: AVG() mit Gewichtung?
am 13.05.2006 20:03:52 von Sebastian Suchanek
Sven Paulus spoke thusly:
> Sebastian Suchanek wrote:
>> Geht das mit MySQL direkt (wenn ja, wie?) oder muß ich die
>> Auswertung doch auf das "umgebende" PHP-Skript auslagern?
>
> Aeh, das ist doch ganz einfach?!
>
> SELECT SUM(Preis*Anzahl)/SUM(Anzahl) FROM xyz
> [...]
Für den Mittelwert schon. Und für die Standardabweichung? :-)
(Ich hätte vielleicht deutlicher in mein Ursprungsposting
schreiben sollen, daß ich die auch benötige.)
Tschüs,
Sebastian
--
http://www.baumaschinen-modelle.net
http://www.schwerlast-rhein-main.de
Re: AVG() mit Gewichtung?
am 13.05.2006 21:15:35 von Sven Paulus
Sebastian Suchanek wrote:
>> Sebastian Suchanek wrote:
>>> Geht das mit MySQL direkt (wenn ja, wie?) oder muß ich die=20
>>> Auswertung doch auf das "umgebende" PHP-Skript auslagern?
>> Aeh, das ist doch ganz einfach?!
>> SELECT SUM(Preis*Anzahl)/SUM(Anzahl) FROM xyz
>> [...]
> Für den Mittelwert schon. Und für die Standardabweichung? :-)
Oh je, da brauche ich jetzt aber auch eine Formelsammlung, auswendig
weiss ich das nicht mehr.
Varianz von n Elementen ist
s=B2 =3D SUM((Element i - Mittelwert aller Elemente)=B2)/(n-1)
Die Standardabweichung ist die Wurzel daraus.
Entsprechend muesste dann:
SELECT SQRT(SUM(Anzahl*POW(Preis-(SELECT SUM(Preis*Anzahl)/SUM(Anzahl) FRO=
M xyz),2))/(SUM(Anzahl)-1)) FROM xyz;
passen. Wichtig bei der Berechnung ist, dass Du nicht die
Standardabweichung von der Summe Preis*Anzahl bildest, das ist etwas
anderes als die Standardabweichung der Summe aller Einzelpreise.
Re: AVG() mit Gewichtung?
am 13.05.2006 22:25:43 von Sebastian Suchanek
Sven Paulus spoke thusly:
> [...]
> Entsprechend muesste dann:
>
> SELECT SQRT(SUM(Anzahl*POW(Preis-(SELECT
> SUM(Preis*Anzahl)/SUM(Anzahl) FROM
> xyz),2))/(SUM(Anzahl)-1)) FROM xyz;
> [...]
Danke soweit.
Aber ab welcher MySQL-Version gibt's denn die Möglichkeit mit
ineinander verschachtelten Abfragen? Mein v4.0.24 zeigt sich da
ziemlich unkooperativ. :-(
Tschüs,
Sebastian
--
http://www.baumaschinen-modelle.net
http://www.schwerlast-rhein-main.de
Re: AVG() mit Gewichtung?
am 14.05.2006 01:56:16 von Gregor Kofler
Sebastian Suchanek meinte:
> Aber ab welcher MySQL-Version gibt's denn die Möglichkeit mit
> ineinander verschachtelten Abfragen? Mein v4.0.24 zeigt sich da
> ziemlich unkooperativ. :-(
Subselects gibts ab 4.1.
Gruß, Gregor
--
http://www.gregorkofler.at ::: Landschafts- und Reisefotografie
http://www.licht-blick.at ::: Forum für Multivisionsvorträge
http://www.image2d.com ::: Bildagentur für den alpinen Raum
Re: AVG() mit Gewichtung?
am 14.05.2006 12:27:51 von Sebastian Suchanek
Gregor Kofler spoke thusly:
> Sebastian Suchanek meinte:
>
>> Aber ab welcher MySQL-Version gibt's denn die Möglichkeit
>> mit ineinander verschachtelten Abfragen? Mein v4.0.24
>> zeigt sich da ziemlich unkooperativ. :-(
>
> Subselects gibts ab 4.1.
Tjo, dann muß ich bis auf weiteres die Auswertung doch mit PHP
machen. :-\
Tschüs,
Sebastian
--
http://www.baumaschinen-modelle.net
http://www.schwerlast-rhein-main.de
Re: AVG() mit Gewichtung?
am 14.05.2006 13:03:35 von Sven Paulus
Sebastian Suchanek wrote:
>>> Aber ab welcher MySQL-Version gibt's denn die Möglichkeit
>>> mit ineinander verschachtelten Abfragen? Mein v4.0.24
>>> zeigt sich da ziemlich unkooperativ. :-(
>> Subselects gibts ab 4.1.
> Tjo, dann muß ich bis auf weiteres die Auswertung doch mit PHP=20
> machen. :-\
Naja, Du machst einfach zwei Queries.
Erst den Mittelwert berechnen (den wolltest Du ja auch eh haben, von=20
daher ist's kein Mehraufwand fuer Dich):
SELECT SUM(Preis*Anzahl)/SUM(Anzahl) FROM xyz
Das Ergebnis merkst Du Dir in der Applikation, z.B. in einer
Variablen $avg. Danach machst Du dann eben noch:
SELECT SQRT(SUM(Anzahl*POW(Preis-$avg,2))/(SUM(Anzahl)-1)) FROM xyz
$avg musst Du natuerlich applikationsseitig in den Query einsetzen.
Re: AVG() mit Gewichtung?
am 14.05.2006 13:32:18 von Thomas Rachel
Sven Paulus wrote:
> Naja, Du machst einfach zwei Queries.
>
> Erst den Mittelwert berechnen (den wolltest Du ja auch eh haben, von
> daher ist's kein Mehraufwand fuer Dich):
>
> SELECT SUM(Preis*Anzahl)/SUM(Anzahl) FROM xyz
oder: SELECT @avg:=SUM(Preis*Anzahl)/SUM(Anzahl) FROM xyz
> Das Ergebnis merkst Du Dir in der Applikation, z.B. in einer
> Variablen $avg.
Oder in MySQL, in einer Variablen @avg.
> Danach machst Du dann eben noch:
>
> SELECT SQRT(SUM(Anzahl*POW(Preis-$avg,2))/(SUM(Anzahl)-1)) FROM xyz
.... oder @avg...
> $avg musst Du natuerlich applikationsseitig in den Query einsetzen.
@avg nicht.
Thomas
--
Vorsicht! Das Vorhandensein dieser Signatur berechtigt nicht zu
unüberlegten Handlungen!
Re: AVG() mit Gewichtung?
am 14.05.2006 14:33:39 von dnoeth
Sven Paulus wrote:
>> Tjo, dann muß ich bis auf weiteres die Auswertung doch mit PHP
>> machen. :-\
>
> Naja, Du machst einfach zwei Queries.
Nö, du nimmst einfach die richtige Formel für die Standardabweichung des
Samples:
STDDEV_SAMP =
SQRT((COUNT(x)*SUM(POW(x,2))-POW(SUM(x),2))/(COUNT(x)*(COUNT (x)-1)))
Dieter
Re: AVG() mit Gewichtung?
am 14.05.2006 17:47:15 von Sebastian Suchanek
Dieter Noeth spoke thusly:
> Sven Paulus wrote:
>
>>> Tjo, dann muß ich bis auf weiteres die Auswertung doch
>>> mit PHP machen. :-\
>>
>> Naja, Du machst einfach zwei Queries.
>
> Nö, du nimmst einfach die richtige Formel für die
> Standardabweichung des Samples:
> STDDEV_SAMP = SQRT((COUNT(x)*SUM(POW(x,2))-POW(SUM(x),2))/(COUNT(x)*(COUNT (x)-1)))
Also wenn, dann so:
....SQRT((SUM(Anzahl)*SUM(Anzahl*POW(Preis,2))-POW(SUM(Anzah l*Preis),2))/(SUM(Anzahl)*(SUM(Anzahl)-1))...
:-)
Tschüs,
Se-"Vielleicht sollte man nach dsm f'uppen"-bastian
--
http://www.baumaschinen-modelle.net
http://www.schwerlast-rhein-main.de
Re: AVG() mit Gewichtung?
am 14.05.2006 17:47:15 von Sebastian Suchanek
Sven Paulus spoke thusly:
> Sebastian Suchanek wrote:
>>>> Aber ab welcher MySQL-Version gibt's denn die
>>>> Möglichkeit mit ineinander verschachtelten Abfragen?
>>>> Mein v4.0.24 zeigt sich da ziemlich unkooperativ. :-(
>>> Subselects gibts ab 4.1.
>> Tjo, dann muß ich bis auf weiteres die Auswertung doch mit
>> PHP machen. :-\
>
> Naja, Du machst einfach zwei Queries.
> [...]
*patsch*
Da hätte ich auch selbst 'drauf kommen können... :-\
Tschüs,
Sebastian
--
http://www.baumaschinen-modelle.net
http://www.schwerlast-rhein-main.de
Re: AVG() mit Gewichtung?
am 14.05.2006 18:23:10 von dnoeth
Sebastian Suchanek wrote:
>> STDDEV_SAMP = SQRT((COUNT(x)*SUM(POW(x,2))-POW(SUM(x),2))/(COUNT(x)*(COUNT (x)-1)))
>
> Also wenn, dann so:
>
> ....SQRT((SUM(Anzahl)*SUM(Anzahl*POW(Preis,2))-POW(SUM(Anzah l*Preis),2))/(SUM(Anzahl)*(SUM(Anzahl)-1))...
>
> :-)
Ein bisschen Eigenleistung muss ja auch noch sein :-)
Dieter