Multiplication ligne à ligne uniquement en SQL

Multiplication ligne à ligne uniquement en SQL - SQL/NoSQL - Programmation

Marsh Posté le 10-09-2004 à 15:40:50    

Bonjour à tous!
une petite question, tout le monde connait la fonction SUM, je cherche à faire la même chose mais au lieu d'aditionner les lignes je voudrais les multiplier.
EXEMPLE:
Nom  |  PRIX               Nom  |  PRIX
A    |    2                A    |    60  
A    |    5     Resultat   b    |    16  
A    |    6     =======>
B    |    8
B    |    2
 
par avance MERCI
 :jap:  
 
 

Reply

Marsh Posté le 10-09-2004 à 15:40:50   

Reply

Marsh Posté le 10-09-2004 à 21:34:49    

Je ne sais pas si ça existe ...
 
par contre, il y a souvent une fonction AVG (average = moyenne), donc si tu fais un AVG(ma_colonne) * count(*) tu devrais tomber sur le résultat ...
 
Quitte à arrondir le résultat, car il y aura sûrement des erreurs d'arrondis.
 

Code :
  1. SELECT AVG(prix) * count(*)
  2. FROM ma_table
  3. GROUP BY nom;

Reply

Marsh Posté le 13-09-2004 à 09:53:05    

Euh non, car AVG(Prix) c'est la somme des prix divise par le nombre de ligne, donc là tu retrouve le somme pas la multiplication des prix.
Mais merci

Reply

Marsh Posté le 13-09-2004 à 10:39:47    

Hmmm...
 
Je teste un truc et je te dis.

Reply

Marsh Posté le 13-09-2004 à 10:42:44    

premier truc, t'es avec quel SGBD ? Access ?

Reply

Marsh Posté le 13-09-2004 à 10:57:47    

Mouais...
 
Je ne vois qu'une solution, que je ne vois pas comment réaliser.
 
En fait, pour 'A', on a :
 2 * 5 * 6
 
C'est aussi égal à :
 
2 + 2 + 2 + 2 + 2
+ 2 + 2 + 2 + 2 + 2
+ 2 + 2 + 2 + 2 + 2
+ 2 + 2 + 2 + 2 + 2
+ 2 + 2 + 2 + 2 + 2
+ 2 + 2 + 2 + 2 + 2
 
(2 qu'on aditionne lui-même 5 fois, puis le tout qu'on aditionne lui-même 6 fois)
 
Il faudrait que tu puisses faire des jointures qui te retourne n lignes, avec n = ligne suivante.
Et faire boucle ceci sur lui-même autant de fois qu'il y a de lignes... Pas gagné.
 
Tu t'en sortira mien avec un PL à mon avis !

Reply

Marsh Posté le 13-09-2004 à 11:03:36    

Peut importe le SGDB, il faut que ce soit du SQL "pure"
Et sans PL.
Je sais c'est très con, mais c'est une colle que quelqu'un à posé en entretient.
Moi j'étais parti avec des Log et Exp, je crois que c'est en SQL2 ça. style exp(sum(Log(prix))) mais ça marche pas top et puis pour des prix negatifs ça marche pas :-(

Reply

Marsh Posté le 13-09-2004 à 11:17:36    

En SQL pure ? Ben la réponse est "nan, impossible".
 
Et c'est totalement certain, pour la simple raison que sans fonction d'agrégation existante, tu ne pourras pas faire ça autrement qu'en PL.
 
Simplement parceque les seuls solution qui existent, c'est de faire un truc du style de ce que j'ai répondu, ou alors en liant n fois la table sur elle-même, en faisant des multiplication sur le même champ issu de chaque jointure.
 
Seulement avec ce système la pronfondeur est fixe (pas plus pas moins).
 
Donc je te le dis avec certitude, c'est impossible.
 
Avec des log de sum, je ne vois pas où tu veux aller, mais préviens-moi quand tu auras dépassé l'orbite de Pluton, tu pourras nous confirmer s'il y a oui ou non une planète de plus dans le système solaire ;)

Reply

Marsh Posté le 13-09-2004 à 11:37:08    

:)
Avec mes souvenirs de math: log(a)+log(b) = log(a*b) OK?
d'ou exp(log(a)+log(b))=a*b.
Tiens voilà un truc qui marche pour des prix entiers strictement positifs
 
SELECT nom, Exp(Sum(logPrix ))
FROM  
(SELECT nom, Log(prix) AS logPrix FROM Table)
GROUP BY nom);
 j'ai trouvé ça au alentoure de Jupiter :)

Reply

Marsh Posté le 13-09-2004 à 11:40:04    

Sauf que comme tu dis, ça merde avec la moitié de N ;)

Reply

Marsh Posté le 13-09-2004 à 11:40:04   

Reply

Marsh Posté le 13-09-2004 à 16:47:25    

J'ai trouv' une solution tres math mais bon ça marche

Code :
  1. SELECT
  2.   TAB1.nom,POWER(-1,TAB1.neg)*exp(NVL(TAB1.multiprix,ln(1)))*exp(NVL(TAB2.multiprix,ln(1)))*NVL(TAB3.multiprix,1)
  3. FROM
  4.   (SELECT nom, Sum(DECODE(sign(prix),-1,ln(abs(prix)),NULL)) multiprix, sum(DECODE(sign(prix),-1,1,0)) neg
  5.    FROM Table1
  6.    GROUP BY nom)  TAB1,
  7.    (SELECT nom, Sum(DECODE(sign(prix),1,ln((prix)),NULL))multiprix
  8.     FROM Table1
  9.     GROUP BY nom)  TAB2,
  10.     (SELECT nom, Sum(DECODE(sign(prix),0,prix,NULL))multiprix
  11.      FROM Table1 GROUP BY nom)  TAB3
  12. WHERE TAB1.NOM=TAB3.nom and  TAB1.NOM=TAB2.nom
  13. ;

Reply

Marsh Posté le 13-09-2004 à 17:04:36    

Sans indiscretrion, c'est quoi la boîte qui t'as demandé ça en entretient ? Que je sâche où c'est pas la peine d'envoyer un CV ? :)
 
Nan, parceque voilà quoi... L'intérêt je le cherche encore, et moi j'aime pas faire un truc pour le plaisir de l'avoir fait, faut que ce soit utile. Une boîte qui se base sur ce genre de critères je trouve ça ridicule. [:spamafote]

Reply

Marsh Posté le 13-09-2004 à 18:24:27    

Je sais plus quelle boite, c'etait une connaissance qui a eut ça. Mais c'était style la dernière question, pour tester le mec. Je pense pa que c'était une question ultra determinante. En tout cas merci de l'interet que tu as porté à ce petit problème
A+

Reply

Marsh Posté le 13-09-2004 à 19:49:00    

Intérêt très limité en fait, parceque ça rentre exactement dans le genre de points que je trouve ridicules dans un entretient. C'est pas le fait de savoir faire ça où non qui va déterminer si tu t'y connais en SQL ou non. C'est malheureusement à mon goût trop classique.
 
Te foutre un shéma de BDD sous les yeux, et te demander, à partir de là, d'implémenter un truc qui n'est pas présent, sans toucher au schéma parcequ'il est figé est infiniment fois plus représentatif des compétences du candidat, et c'est plus souvent qu'on a ce type de problèmes... Donc il vaut mieu être compétent à ce niveau ;)
 
D'un autre côté, cette question me semble plus du style de la question qu'on demande à une commerciale durant son entretient : "Quelle est la couleur de votre culotte". Le truc pour savoir comment s'en tire la personne face à une question embarassante. Je pense que le fait que tu apportes ou non une solution revient au même, c'est surtout ta réaction qui compte. Un point sur lequel je dois bosser, parceque j'ai tendance à être un peu trop franc dans mes réponses "t'ain mais t'es con ? qu'est-ce qu'on en a à foutre ? :o" :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed