Hallo Bernd,
das kommt davon wenn man Tipps nicht vorher ausprobiert, sorry.
Aber es ist ganz einfach: du musst nur tun, was er dir sagt. Der innere Select ist eine abgeleitete Tabelle (derived table) und braucht einen Aliasnamen.
Was ist ein Aliasname? Kennst Du, z.B. hier:
select x.foo, x.bar FROM sometable x
x ist der Aliasname für die Tabelle sometable.
In deinem Fall also so (ich verkürze mal etwas):
select sum(...)
from (select *wilde rechnerei* from artikel where a_programm=?) werte
Der Aliasname wäre hier werte
.
Ich hätte aber noch eine andere Idee für Dich. MYSQL kennt ein Ding namens VIEW. Du könntest einen View auf deine Artikeltabelle anlegen, in dem die falsch gespeicherten Felder konvertiert werden. Beispiel aus meiner lokalen DB:
CREATE TABLE `artikel` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`foo` varchar(20) DEFAULT NULL,
`bar` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
INSERT INTO `test`.`artikel` (`foo`, `bar`)
VALUES ('12,34', '47,11');
CREATE
VIEW `num_artikel` AS
SELECT
id,
CAST(REPLACE(`artikel`.`foo`, ',', '.') AS DECIMAL (10 , 2 )) AS `foo`,
CAST(REPLACE(`artikel`.`bar`, ',', '.') AS DECIMAL (10 , 2 )) AS `bar`
FROM
`artikel`
Wenn Du sowas tun willst, musst Du es natürlich für Dich und Deinen Bedarf anpassen. Felder, die keine Kommazahlen enthalten (bei mir: Id), übernimmst Du 1:1. Jedes Feld, das deine Kommazahlen enthält, braucht einen entsprechenden CAST und REPLACE. Im View erscheint es dann als ein DECIMAL(10,2) Feld, das bedeutet: 10 Ziffern, 2 davon Nachkommastellen. Wenn deine Zahlen anders strukturiert sind, musst Du die Größe der Decimals anpassen.
Aber damit kannst Du dann Queries machen, die nicht mehr konvertieren müssen. Die normalen CRUD-Operationen (das Tagesgeschäft: Create, Read, Update, Delete) machst Du auf der Table. Und wenn Du in der DB rechnen willst, nimmst Du den View. Der spiegelt automatisch immer den Inhalt der Table wieder.
Rolf
sumpsi - posui - clusi