Aggregatfunktion Multiplikation
Aggregatfunktion Multiplikation
am 24.01.2006 12:54:01 von huvermann
Hallo,
select sum(feldname) from tabellenname
summiert mir eine Tabellenspalten.
Ich benötige aber eine Multiplikation:
select mult(Feldname) from Tabellenname
Leider gibts keine Multiplikation bei Aggregatfunktionen, oder?
Ich möchte diese Funktionalität unbedingt von der Datenbank ausführen
lassen und nicht in die Programmlogik aufnehmen.
Vielen Dank.
Re: Aggregatfunktion Multiplikation
am 24.01.2006 13:04:15 von Andreas Kretschmer
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Re: Aggregatfunktion Multiplikation
am 24.01.2006 13:56:26 von Dominik Echterbruch
Heiko. Huvermann wrote:
> Hallo,
>
> select sum(feldname) from tabellenname
>
> summiert mir eine Tabellenspalten.
>
> Ich benötige aber eine Multiplikation:
>
> select mult(Feldname) from Tabellenname
Eine Benutzerdefinierte Variable [1] könnte evtl. helfen. Ich habe zwar
jetzt auf Anhieb keine Möglichkeit gefunden, in einem einzelnen SELECT
über mehrere Zeilen zu aggregieren, aber vielleicht habe ich in der Doku
auch was übersehen. Schau deshalb lieber selber noch mal drüber.
Das wäre dann nicht ganz so viel Aufwand, wie eine Funktion (vor allem
für die DB), hat aber natürlich den Nachteil, daß man das jedes Mal von
vorne machen muß :)
[1] http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
Grüße,
Dominik
--
MonstersGame - Die Schlacht zwischen Vampiren und Werwölfen
http://spielwelt6.monstersgame.net/?ac=vid&vid=3018786
Re: Aggregatfunktion Multiplikation
am 24.01.2006 15:52:26 von huvermann
Hallo Andreas,
Andreas Kretschmer schrieb:
....
>>Leider gibts keine Multiplikation bei Aggregatfunktionen, oder?
>
>
>
> Nein, kann man sich aber selber schreiben, unter PG z.B. so:
>
> ,----[ PG ]
> | --
> | -- select the product as a aggregate function (for a int-column)
> | --
> |
> | CREATE FUNCTION multiply_aggregate(int,int) RETURNS int AS '
> | select $1 * $2;
> | ' language sql IMMUTABLE STRICT;
> |
> | CREATE AGGREGATE multiply (basetype=int, sfunc=multiply_aggregate,
> | stype=int, initcond=1 )
> `----
>
Danke! Auf einem Webserver ist noch MySQL 3.X drauf, ich wollte
eigentlich abwärtskompatibel bleiben und Stored Procedures werden ja
erst ab MySQL 4 unterstützt.
Hmm, da muß ich mich wohl entscheiden, ob ich kompatibel zu Vers. 3
bleibe und die Funktionalität in die Applikation bringe, oder ob ich
sage, daß unbedingt Version 4 benutzt werden muß.
Für ein Update auf Version 4 muß ich die Applikation vom Netz nehmen um
die DB neu aufzusetzen, aber das wird wohl sowieso das Beste sein.
Grüße
Heiko
Re: Aggregatfunktion Multiplikation
am 24.01.2006 16:17:19 von Andreas Kretschmer
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Re: Aggregatfunktion Multiplikation
am 24.01.2006 16:53:52 von huvermann
Andreas Kretschmer schrieb:
....
> Ist nicht mittlerweile MySQL bei 5.x? *g*
MySQL schon, aber die Server bei den Providern nicht unbedingt.
Grüße
Heiko
Re: Aggregatfunktion Multiplikation
am 24.01.2006 17:28:32 von Hartmut Holzgraefe
Heiko. Huvermann wrote:
> Danke! Auf einem Webserver ist noch MySQL 3.X drauf, ich wollte=20
> eigentlich abwärtskompatibel bleiben und Stored Procedures werden ja =
> erst ab MySQL 4 unterstützt.
5.0, nicht 4
--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com
http://www.mysql.com/support/
Re: Aggregatfunktion Multiplikation
am 24.01.2006 17:35:10 von Hartmut Holzgraefe
Heiko. Huvermann wrote:
> Hallo,
>=20
> select sum(feldname) from tabellenname
>=20
> summiert mir eine Tabellenspalten.
>=20
> Ich benötige aber eine Multiplikation:
>=20
> select mult(Feldname) from Tabellenname
>=20
> Leider gibts keine Multiplikation bei Aggregatfunktionen, oder?
>=20
> Ich möchte diese Funktionalität unbedingt von der Datenbank ausfü=
hren=20
> lassen und nicht in die Programmlogik aufnehmen.
Du könntest eine entsprechende UserDefinedFunction in C implementieren,=
ob das aufwandsmäßig allerdings in einem vernünftigen Verhältnis =
zum
Nutzen steht sei dahingestellt.
Siehe http://dev.mysql.com/doc/refman/4.1/en/adding-functions.html
und http://pear.php.net/CodeGen_MySQL_UDF
Oder du benutzt ein bischen Schulmathematik:
SELECT EXP(SUM(LN(Feldname))) FROM Tabellenname
Ich frage mich allerdings ob eine solche Funktion überhaupt sinnvoll
sein kann da so eine geometrische Reihe doch recht schnell *sehr*
große Ergebniswerte erreichen kann?
--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com
http://www.mysql.com/support/
Re: Aggregatfunktion Multiplikation
am 24.01.2006 18:44:42 von Josef Poetzl
Hallo!
Heiko. Huvermann schrieb:
> select sum(feldname) from tabellenname
> summiert mir eine Tabellenspalten.
> Ich benötige aber eine Multiplikation:
> select mult(Feldname) from Tabellenname
> Leider gibts keine Multiplikation bei Aggregatfunktionen, oder?
Die gibt es - aber etwas versteckt. ;-)
select exp(sum(log(feldname))) from tabellenname
mfg
Josef
Re: Aggregatfunktion Multiplikation
am 24.01.2006 19:07:19 von huvermann
Hartmut Holzgraefe schrieb:
....
> Oder du benutzt ein bischen Schulmathematik:
>
> SELECT EXP(SUM(LN(Feldname))) FROM Tabellenname
>
> Ich frage mich allerdings ob eine solche Funktion überhaupt sinnvoll
> sein kann da so eine geometrische Reihe doch recht schnell *sehr*
> große Ergebniswerte erreichen kann?
>
>
EXP(SUM(LN(Feldname))) ??
Der Wert der Felder ist nicht gleich, wie soll da eine
Logarithums-Funktion helfen.
Nein, es sollten keine großen Werte entstehen können, sondern Werte die
kleiner als 1 sind. Es ist eine Tabelle mit Rabattstaffeln.
Aus den Prozent-Werten z.B. 2.5, 3, 6 muß ein Rabattfaktor errechnet
werden, also
Nachfolger = Vorgänger * (100-Feld) / 100
Die Anzahl der Rabatt-Zahlen ist variabel.
Grüße
Heiko
Re: Aggregatfunktion Multiplikation
am 24.01.2006 19:37:37 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Aggregatfunktion Multiplikation
am 24.01.2006 21:01:40 von huvermann
Andreas Kretschmer schrieb:
...
>
>>EXP(SUM(LN(Feldname))) ??
>
>
> ;-), hatte ich auch schon die Idee...
>
>
>>Der Wert der Felder ist nicht gleich, wie soll da eine
>>Logarithums-Funktion helfen.
>
>
> Wenn Du von zwei Zahlen den Logarithmus berechnest, das summierst und
> den Logarithus wieder umkehrst, hast Du das Produkt der zwei Zahlen.
> Von hinten durch die Brust, weil sicherlich relativ rechenintensiv.
> (P.S.: wer wie ich noch den Rechenstab gelernt und verstanden hat, kommt
> auf solche Lösungen...)
>
Ahh, jetzt fällt der Groschen.
Wahrscheinlich falle ich nun aber bei der Rundungsgenauigkeit später auf
die Nase. Möglich, dass bei der 4 Stelle kaufmännisch gerundet werden
muß. Das weiß ich noch nicht. Das wird dann zu fummelig, dies dann über
SQL berechnen zu lassen.
>
> Kann MySQL selbst definierte Aggregat-Funktionen? Scheinbar (noch)
> nicht, oder?
>
Weiss noch nicht, weil ich Funktionen erst mal vermeiden möchte.
Aber interessant...
Hätte ich nicht erwartet das etwas anspruchsvollere Mathematik bei der
Datenbankprogrammierung sinnvoll sein kann.
Gruß
Heiko
Re: Aggregatfunktion Multiplikation
am 25.01.2006 03:14:51 von Hartmut Holzgraefe
Andreas Kretschmer wrote:
> begin Heiko. Huvermann wrote:
>> Hartmut Holzgraefe schrieb:
>> ...
>>> Oder du benutzt ein bischen Schulmathematik:
>>>
>>> SELECT EXP(SUM(LN(Feldname))) FROM Tabellenname
>>>
>>> Ich frage mich allerdings ob eine solche Funktion überhaupt sinnvol=
l
>>> sein kann da so eine geometrische Reihe doch recht schnell *sehr*
>>> große Ergebniswerte erreichen kann?
>>>
>>>
>=20
>> EXP(SUM(LN(Feldname))) ??
>=20
> ;-), hatte ich auch schon die Idee...
>=20
>> Der Wert der Felder ist nicht gleich, wie soll da eine=20
>> Logarithums-Funktion helfen.
>=20
> Wenn Du von zwei Zahlen den Logarithmus berechnest, das summierst und
> den Logarithus wieder umkehrst, hast Du das Produkt der zwei Zahlen.
> Von hinten durch die Brust, weil sicherlich relativ rechenintensiv.
> (P.S.: wer wie ich noch den Rechenstab gelernt und verstanden hat, komm=
t
> auf solche Lösungen...)
>=20
>=20
> Kann MySQL selbst definierte Aggregat-Funktionen? Scheinbar (noch)
> nicht, oder?
Bisher nur als in C/C++ implementierte UserDefinedFunctions (UDFs),
nicht über die Stored Procedure Language (mal morgen nachschlagen
was ANSI zu dem Thema sagt):
http://dev.mysql.com/doc/refman/4.1/en/create-function.html
Aggregat-Unterstützung für UDFs gibt es seit 3.23, also schon *sehr*
lange ...
--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com
http://www.mysql.com/support/
Re: Aggregatfunktion Multiplikation
am 25.01.2006 03:15:38 von Hartmut Holzgraefe
Andreas Kretschmer wrote:
> Kann MySQL selbst definierte Aggregat-Funktionen? Scheinbar (noch)
> nicht, oder?
Bisher nur als in C/C++ implementierte UserDefinedFunctions (UDFs),
nicht über die Stored Procedure Language (mal morgen nachschlagen
was ANSI zu dem Thema sagt):
http://dev.mysql.com/doc/refman/4.1/en/create-function.html
Aggregat-Unterstützung für UDFs gibt es seit 3.23, also schon *sehr*
lange ...
--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com
http://www.mysql.com/support/
Re: Aggregatfunktion Multiplikation
am 25.01.2006 14:51:53 von Hartmut Holzgraefe
Hartmut Holzgraefe wrote:
> Andreas Kretschmer wrote:
>> Kann MySQL selbst definierte Aggregat-Funktionen? Scheinbar (noch)
>> nicht, oder?
>=20
> (mal morgen nachschlagen was ANSI zu dem Thema sagt)
Zumindest ANSI-SQL99 sieht keine Möglichkeit vor eigene
Aggregat-Funktionen zu erstellen.
--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com
http://www.mysql.com/support/
Re: Aggregatfunktion Multiplikation
am 26.01.2006 09:25:11 von huvermann
Hallo Hartmut,
Hartmut Holzgraefe schrieb:
> Andreas Kretschmer wrote:
>
>> Kann MySQL selbst definierte Aggregat-Funktionen? Scheinbar (noch)
>> nicht, oder?
>
>
> Bisher nur als in C/C++ implementierte UserDefinedFunctions (UDFs),
> nicht über die Stored Procedure Language (mal morgen nachschlagen
> was ANSI zu dem Thema sagt):
>
> http://dev.mysql.com/doc/refman/4.1/en/create-function.html
>
> Aggregat-Unterstützung für UDFs gibt es seit 3.23, also schon *sehr*
> lange ...
Danke. UDF wäre eine schöne Möglichkeit, aber kommt nicht in Frage, da
nicht sicher gestellt ist, ob ich auf dem Zielsystem eine Binär-Library
compilieren und installieren darf.
Da die Datenbank auf mehreren Betriebssystemen läuft, müßte ich die
Library für Linux und und Windows kompilieren. Für diese eine Funktion
ist der Aufwand nicht gerechtfertigt.
Aus Perfonance-Sicht ist so eine Möglichkeit natürlich klasse.
Ich baues es über ein extra query in die Programm-Logic ein.
Gruß
Heiko
Re: Aggregatfunktion Multiplikation
am 26.01.2006 09:41:40 von huvermann
Jetzt habe ich natürlich nicht nachgesehen,
ob bei mysql nicht schon eine Library mit einer brauchbaren
Multiplikations-Routine vorhanden ist, die man
als UDF einbinden könnte.
Gruß
Heiko
Re: Aggregatfunktion Multiplikation
am 26.01.2006 09:51:37 von Hartmut Holzgraefe
Heiko. Huvermann wrote:
> Jetzt habe ich natürlich nicht nachgesehen,
> ob bei mysql nicht schon eine Library mit einer brauchbaren
> Multiplikations-Routine vorhanden ist, die man
> als UDF einbinden könnte.
nein, gibt es nicht, wir stellen bisher keinerlei vorkompilierte
UDF extensions bereit
--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com
http://www.mysql.com/support/