IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Fonction produit avec group by


Sujet :

Requêtes MySQL

  1. #1
    Membre averti Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Points : 362
    Points
    362
    Par défaut Fonction produit avec group by
    Bonjour,
    Existe-t-il en sql une fonction mathématique permettant de faire un produit des valeurs d'un champ dans une table, un peu de la même manière que Sum permet de faire une somme?

    Une fonction du genre: "select prod(champ_nb) from T group by champ_x"

    avec comme résultat le produit des valeurs de champ_nb. Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    champ_x | champ_nb
    A             2
    A             5
    A             4
    A             3
    B             2
    B             6
    B             2
    Résultat:
    A 120 (2*5*4*3)
    B 24 (2*6*2)


    Merci.

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    La question a déja été posée récemment me semble-t'il.
    La solution passait par les logarithmes et donnait, de mémoire, quelque chose comme : EXP(SUM(LN(champ_nb))).
    Cherche dans les posts récents il me semble que c'était cette semaine.

    NB.
    C'était là (http://www.developpez.net/forums/d61...l/produit-sql/) et c'était il y a 5 jours.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre averti Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Points : 362
    Points
    362
    Par défaut
    ok, merci. Désolé pour le post mais j'avais cherché "fonction produit" dans le forum "mysql" et je n'avais pas trouvé cette réponse.

  4. #4
    Membre averti Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Points : 362
    Points
    362
    Par défaut
    Une petite annexe à la question :
    Avec la formule EXP(SUM(LN(X))) si l'une des valeurs de X est égale à 0 => le résultat renvoyé par mysql est faut. En effet il prend 'null' comme valeur de ln(0) et du coup ln(x) + ln(0) = ln(x) pour mysql.
    Donc si par exemple on fait le produit 4 x 0 mysql va faire:
    exp(sum(ln(4), ln(0))) = exp(sum(ln(4))) = 4
    ...
    Comment peut-on donc tester si l'une des valeurs vaut 0? Cela est-il faisable en sql?

    Merci

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Salut,
    A priori cette requête a l'air de marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select t.c, 
                 case when temp_s.s1!=temp_s.s2 then 0 
                 else exp(sum(ln(replace(c2,0,1)))) end as produit
    from t join (select c,sum(c2) as s1, sum(replace(c2,0,1)) as s2 from t group by c) temp_s
    	 on t.c=temp_s.c
    group by t.c, temp_s.s1,temp_s.s2;
    Le with s'est juste pour générer un jeu de test. J'ai pas testé sous mysql mais normalement ma requête est normalisée donc elle doit marcher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    SQL> with t as (select 'A' as c, 2 as c2 from dual
      2  union all
      3  select 'A' as c, 5 as c2 from dual
      4  union all
      5  select 'A' as c, 0 as c2 from dual
      6  union all
      7  select 'B' as c, 2 as c2 from dual
      8  union all
      9  select 'B' as c, 6 as c2 from dual
     10  union all
     11  select 'B' as c, 2 as c2 from dual)
     12  select t.c,
     13        case when temp_s.s1!=temp_s.s2 then 0
     14                     else exp(sum(ln(replace(c2,0,1)))) end as produit
     15  from t join (select c,sum(c2) as s1, sum(replace(c2,0,1)) as s2 from t group by c) temp_s
     16      on t.c=temp_s.c
     17  group by t.c, temp_s.s1,temp_s.s2;
     
    C    PRODUIT
    - ----------
    A          0
    B         24
    Par contre pour ce qui est des sommes avec NULL je te conseille cette discussion pour bien comprendre les diverses subtilitées.

  6. #6
    Membre averti Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Points : 362
    Points
    362
    Par défaut
    Effectivement ça fonctionne également sous mysql.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-97] Souci avec Fonction "Produit" dans un TCD
    Par Yamina62 dans le forum Excel
    Réponses: 4
    Dernier message: 30/10/2013, 11h59
  2. Réponses: 2
    Dernier message: 16/05/2012, 09h48
  3. Fonction Substring avec group by
    Par zaki31 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 30/05/2007, 12h37
  4. fonction left avec sql server 6.5
    Par shake dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/06/2004, 08h48
  5. Fonction If avec rs.eof problème
    Par M1000 dans le forum ASP
    Réponses: 5
    Dernier message: 24/03/2004, 17h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo