Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Contribuez
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/02/2011, 13h29   #1
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Par défaut Quel est l'équivalent de la fonction SUM pour un produit ?

Bonjour,

Je vous propose un nouvel élément à utiliser : Quel est l'équivalent de la fonction SUM pour un produit ?

MySQL n'a pas de fonction pour agréger par produit. Toutefois, il est possible de le faire avec les fonctions EXP et LN.

Si, par exemple, vous avez la table suivante

Code :
1
2
3
4
5
CREATE TABLE Exemple (
  forme varchar(20),
  dimension varchar(10),
  facteur float NOT NULL
) ;
Et le jeu de données suivant

Code :
1
2
3
4
5
6
INSERT INTO Exemple VALUES('parallélépipède', 'largeur', 10);
INSERT INTO Exemple VALUES('parallélépipède', 'longueur', 30);
INSERT INTO Exemple VALUES('parallélépipède', 'hauteur', 15);
INSERT INTO Exemple VALUES('pyramide', 'base', 20);
INSERT INTO Exemple VALUES('pyramide', 'hauteur', 30);
INSERT INTO Exemple VALUES('pyramide', 'constante', 1/3);
On veut calculer le volume de chaque forme, et donc faire quelque chose comme :

Code :
1
2
3
4
-- erreur de syntaxe
SELECT forme, Produit(facteur) AS Volume
FROM Exemple
GROUP BY forme
Cette requête n'est pas valide parce que la fonction Produit() n'existe pas.

on la remplacera donc par l'exponentiel d'une somme de logarithmes :

Code :
1
2
3
SELECT forme, EXP(SUM(LN(facteur))) AS Volume
FROM Exemple
GROUP BY forme
Qu'en pensez-vous ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 11h01   #2
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2006
Messages : 951
Points : 1 063
Points : 1 063
c'est trivial pour qui a fait des maths. faut voir apres avec quelque exemple si on a pas un probleme de précision de calcul.

ceci dit c'est complètement faux.

le domaine de définition de l'opérateur multiplication c'est celui du corps commutatif dont il participe à la définition.

le domaine de définition de la fonction logarythme c'est R+*, je veux dire c'est réel par beau temps mais strictement positif.

du coup pour être strict il faut au minimum ajouter des valeurs absolues pour traiter le cas des multiplieurs négatifs et faire une condition spéciale pour le cas ou des "opérandes" est nulle.

du coup... faut vraiment voir au cas par cas.
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 08/12/2011, 14h19   #3
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut,

Non, c'est pas au cas par cas, tu peux faire ta formule générique.

Code :
1
2
 
CASE WHEN MIN(abs(facteur)) = 0 THEN 0 ELSE EXP(SUM(LN(abs(facteur)))) * power(-1, mod(sum(case when facter < 0 then 1 else 0 end, 2)) END
(Non testé, écrit par quelqu'un qui fait de l'Oracle mais on doit pouvoir faire la même chez vous )

Par contre, chuis d'accord sur la précision : à tester ou à démontrer.

[EDIT]
Pour le traitement des nulls, à toi de voir ce que tu veux.
Le NULL est neutre pour sum, donc neutre pour exp(sum(ln()).
Si tu veux qu'il absorbe, tu ajoutes au résultat un facteur qui détecte le NULL et le transforme en 0 (genre min(case when facteur is null then 0 else 1 end))
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 14h29   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Il y a COALESCE pour transformer un NULL en 0 !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 14h32   #5
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
C'était pour éviter de faire des abs, mais effectivement ça serait plus joli avec coalesce
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h11.


 
 
 
 
Partenaires

Hébergement Web