2010-06-19 7 views
1

J'essaie de pondérer un peu mes données en utilisant une procédure stockée. Fondamentalement, cela signifie multiplier certaines colonnes avec leurs poids respectifs et les additionner à la fin.Traitement des résultats intermédiaires dans la procédure stockée MySQL

J'ai écrit la procédure stockée suivante:

CREATE PROCEDURE test() 
BEGIN 
DECLARE w1 DOUBLE; 
DECLARE w2 DOUBLE; 
DECLARE res1 DOUBLE; 
DECLARE res2 DOUBLE; 
DECLARE finres DOUBLE; 
SELECT weight1 INTO w1 FROM weights; 
SELECT weight2 INTO w2 FROM weights; 
SELECT w1 * var1 INTO res1 FROM vartable; 
SELECT w2 * var2 INTO res1 FROM vartable; 
SELECT res1+res2 INTO finres; 
SELECT MEAN(finres); 
END 
// 

Malheureusement, il ne le fait pas encore l'affaire. À la fin, il devrait retourner une valeur, mais tout cela ne fonctionne que si je mets tous les vars à la requête SELECT.

Répondre

0

Je l'ai! Ce qui suit fonctionne:

CREATE PROCEDURE test2 (IN period1 INT) 
BEGIN 
DECLARE x1 DOUBLE; 
DECLARE x2 DOUBLE; 
DECLARE param1 DOUBLE; 
SELECT wvalue INTO x1 FROM weights WHERE uid=1; 
SELECT wvalue INTO x2 FROM weights WHERE uid=2; 

SELECT x1*x2 INTO param1; 
INSERT result_table(result,period) SELECT param1,period1; 

END 
// 
DELIMITER ; 

call test2 (@la); 

Puis-je stocker ce résultat en quelque sorte? EDIT: a compris celui-là aussi. Stockez-le dans une table existante, voir modifier.

0

Selon mysql docu vous devez déclarer le paramètre que vous voulez à la sortie

Comme

CREATE PROCEDURE simpleproc (OUT param1 INT) 

stocker la valeur dans param1 et appeler la procédure avec:

CALL simpleproc(@a); 

et obtenir la valeur avec:

SELECT @a; 

Cela devrait faire l'affaire

+0

J'ai sélectionné la valeur IN1 param1. La création de la procédure stockée n'a pas provoqué d'erreur, mais le @ reste NULL. Qu'ai-je fait de mal? –

0

Désolé, foiré ma première réponse, ne comprenait pas le problème ....

Vous voulez calculer la moyenne de vos poids multipliés avec les variables. Mais dans votre procédure, vous ne stockez que des doubles. Ainsi, votre calcul MEAN dépasse un double. À mon humble avis qui n'a aucun sens. Par exemple. Le MOYEN de 5? :-)

Qu'est-ce qui est écrit dans vos tableaux? Une seule rangée de poids et une rangée de variables?

+0

:) yup, signifie d'un scalaire n'est pas si intelligent ... J'ai des données dans mon datatable et des poids dans une table de poids. Maintenant, je voudrais multiplier column1 des données avec weight1 et ainsi de suite. Ensuite, je voudrais faire une somme (weightedcol1 + weightedcol2) qui renvoie un vecteur. La dernière étape est à AVG (résultat) - oui AVG est correct ne signifie pas :) - et ensuite retourner AVG (résultat) –

+0

vous voulez dire: sélectionnez AVG (weight1 * var1 + weight2 * var2) à partir de poids, vartable; Et pourquoi ne pas le faire dans un select? – TooAngel

+0

En fait, le schéma de pondération est plus compliqué que décrit. w1 * d1 = data1 w2 * d2 = data2 w3 * d3 = Data3 w4 * d4 = données4 w5 * d5 = données5 intermediate1 = data1 intermediate2 = data2 + données5 intermédiaire3 = data3 + Data4 résultat = intermédiaire1 * w6 + intermédiaire2 * w7 + intermédiaire3 * w8 :) Tout ce que je veux, c'est le résultat à renvoyer. –

0

Essayez comme ceci:

SELECT AVG(W.weight1 * V.var1 + W.weight2 * V.var2) FROM weights W, vars V; 
+0

Les requêtes deviendront vraiment moche comme ça parce que je dois obtenir weight1 avec quelque chose comme: SELECT poids de poids WHERE uid = 1 –

Questions connexes