Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1283 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Multiplication ligne à ligne uniquement en SQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Multiplication ligne à ligne uniquement en SQL

n°847024
mehdou
Posté le 10-09-2004 à 15:40:50  profilanswer
 

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:  
 
 

mood
Publicité
Posté le 10-09-2004 à 15:40:50  profilanswer
 

n°847365
Beegee
Posté le 10-09-2004 à 21:34:49  profilanswer
 

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;

n°848401
mehdou
Posté le 13-09-2004 à 09:53:05  profilanswer
 

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

n°848450
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-09-2004 à 10:39:47  profilanswer
 

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

n°848454
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-09-2004 à 10:42:44  profilanswer
 

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

n°848468
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-09-2004 à 10:57:47  profilanswer
 

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 !

n°848478
mehdou
Posté le 13-09-2004 à 11:03:36  profilanswer
 

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 :-(

n°848500
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-09-2004 à 11:17:36  profilanswer
 

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 ;)

n°848530
mehdou
Posté le 13-09-2004 à 11:37:08  profilanswer
 

:)
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 :)

n°848539
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-09-2004 à 11:40:04  profilanswer
 

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

mood
Publicité
Posté le 13-09-2004 à 11:40:04  profilanswer
 

n°848938
mehdou
Posté le 13-09-2004 à 16:47:25  profilanswer
 

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. ;

n°848961
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-09-2004 à 17:04:36  profilanswer
 

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]

n°849026
mehdou
Posté le 13-09-2004 à 18:24:27  profilanswer
 

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+

n°849086
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-09-2004 à 19:49:00  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Multiplication ligne à ligne uniquement en SQL

 

Sujets relatifs
exe de requêtes acceptant des .sql en paramètres avec mysql[VBA Excel / SQL] Extraction automatique à période régulière
[divers] Supprimer les retours à ligne présents dans fichier texte[php] quel syntaxe pour ecrire un if .. else en une seule ligne ?
lié des tables SQL server en lecture via Access (résolu)Delphi et SQL
connexion ODBC sur un serveur sql 2000 par internetaccess excel problème de caractères retour à la ligne, etc...
concurrence d acces (Access - SQL Server)Compresser un champ dans une table sous SQL server
Plus de sujets relatifs à : Multiplication ligne à ligne uniquement en SQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR