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

Langage SQL Discussion :

[SQL] SUM de SUM()


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Par défaut [SQL] SUM de SUM()
    Bonjour,

    Je cherche depuis un bon moment comment faire une requête.

    Voici l'énoncé de mon problème :

    J'ai 2 tables qui se présentent comme suit :

    Table des objectifs :

    nego_id | agence_id | objectif
    1		1	52000
    2		1	48560
    3 		1      24561
    4		2	49787
    5		2	45211
    6		3	56988
    ...
    
    Table des transactions :

    tra_nego_id | tra_agence_id | tra_honoraires1 | tra_honoraires2 | tra_honoraires3 | tra_honoraires4 
    1		   1		          1240		2458	   3254			1548
    2		   1		          4896		7854	   2584			7985	
    3		   1			  1231		4567	   7899			1569
    4		   2			  1548		7896	   4521			7965
    5		   2			  2548		7895	   1468			4684
    6		   3			  4521		7845	   5456			7458
    ...
    Dans un premier temps je voulais ressortir un résultat comme suit :

    nego_id | objectif | somme_honoraires 
    1	   52000	   8500
    ...
    J'ai donc fait une requête qui se présente comme suit (pour l'agence 1) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT O.nego_id, objectif 
             	,SUM(T1.tra_honoraires1) AS 'somme 1'
                ,SUM(T2.tra_honoraires2) AS 'somme 2'
                ,SUM(T3.tra_honoraires3) AS 'somme 3'
                ,SUM(T4.tra_honoraires4) AS 'somme 4'           
    FROM     Objectifs O
    LEFT JOIN Transactions T1 				ON O.nego_id = T1.tra_honoraires1
    LEFT JOIN Transactions T2 				ON O.nego_id = T2.tra_honoraires2
    LEFT JOIN Transactions T3 				ON O.nego_id = T3.tra_honoraires3
    LEFT JOIN Transactions T4 				ON O.nego_id = T4.tra_honoraires4                    
    WHERE     O.agence_id = 1
    GROUP BY  O.nego_id,	O.objectif
    Puis j’additionne en php les honoraires de chaque négociateur pour avoir le résultat voulu.

    Première question : Comment avoir le résultat directement à la sortie de la requête, autrement dit : Comment faire la somme des sommes par nego dans la requête ? (j'ai bien tenté de faire un SUM des SUMs mais ça n'a pas l'air de fonctionner)

    Deuxième question : Comment obtenir le même résultat par agence ? :

    agence_id | objectif | somme_honoraires 
    1	   125121	   47085
    ...
    Merci de votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    si la relation entre vos tables objectifs et transactions est de type :
    objectifs 0,1 ------- 0,1 Transactions

    alors le group by est inutile (vu l'exemple ça doit être ça).

    Donc en partant de ce postulat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select obj.nego_id, obj.objectif,
    tra_honoraires1 + tra_honoraires2 + tra_honoraires3 + tra_honoraires4 as somme_honoraires 
    from objectifs obj
    left outer join transactions trans on trans.tra_nego_id = obj.nego_id and trans.tra_agence_id = obj.agence_id
    edit : enfin vu vos clauses de jointures je doute que votre requête actuelle marche ou alors vous avez mal décrit vos tables...

    Concernant le résultat par agence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select obj.agence_id, sum(obj.objectif) as somme_agence,
    sum(tra_honoraires1 + tra_honoraires2 + tra_honoraires3 + tra_honoraires4) as somme_honoraires 
    from objectifs obj
    left outer join transactions trans on trans.tra_agence_id = obj.agence_id
    group by obj.agence_id

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Par défaut
    Oui effectivement, désolé , en voulant simplifier je me suis trompé dans l'énoncé :

    Il faut rajouter les colonnes suivantes à la table Transactions :

    tra_nego_honoraires1 | tra_nego_honoraires2 | tra_nego_honoraires3 | tra_nego_honoraires4
    (celles-ci désignant les negos qui touchent respectivement les honoraires : tra_honoraires1, tra_honoraires2, tra_honoraires3, tra_honoraires4)

    La problématique est que le nego qui passe la transaction (tra_nego) n'est pas le seul à toucher des honoraires (les colonnes ci-dessus).

    Donc, ma requête est en fait de cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT O.nego_id, objectif 
             	,SUM(T1.tra_honoraires1) AS 'somme 1'
                ,SUM(T2.tra_honoraires2) AS 'somme 2'
                ,SUM(T3.tra_honoraires3) AS 'somme 3'
                ,SUM(T4.tra_honoraires4) AS 'somme 4'           
    FROM     Objectifs O
    LEFT JOIN Transactions T1 				ON O.nego_id = T1.tra_nego_honoraires1
    LEFT JOIN Transactions T2 				ON O.nego_id = T2.tra_nego_honoraires2
    LEFT JOIN Transactions T3 				ON O.nego_id = T3.tra_nego_honoraires3
    LEFT JOIN Transactions T4 				ON O.nego_id = T4.tra_nego_honoraires4                    
    WHERE     O.agence_id = 1
    GROUP BY  O.nego_id,	O.objectif

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,

    Je ne comprend pas, veuillez décrire vos table et les ralations entre elle correctement.

    Merci.

    exemple :
    objectif (nego_id, agence_id , objectif, ..)

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Par défaut
    Oui je comprend, désolé si je me suis mal exprimé mais ça n'est pas facile à expliquer. Je vais tenter de préciser :

    Objectifs (nego_id, agence_id , objectif)

    Transactions(tra_nego_id,tra_agence_id,tra_nego_honoraires1,tra_nego_honoraires2,tra_nego_honoraires3,tra_nego_honoraires4,tra_honoraires1,
    tra_honoraires2,tra_honoraires3,tra_honoraires4)

    Explications des colonnes :

    Pour la table Objectifs :

    nego_id = l'identifiant du nego
    agence_id = son agence
    objectif = son objectif d'honoraires

    Pour la table Transactions :

    tra_nego_id = l'identifiant du nego qui à saisi la transaction
    tra_agence_id = son agence
    tra_nego_honoraires1 = le nego bénéficiaire de l'honoraire tra_honoraires1 (c'est forcément le nego qui à saisi la transaction)
    tra_nego_honoraires2 = le nego bénéficiaire de l'honoraire tra_honoraires2
    tra_nego_honoraires3 = le nego bénéficiaire de l'honoraire tra_honoraires3
    tra_nego_honoraires4 = le nego bénéficiaire de l'honoraire tra_honoraires4

    Ces tables étaient existantes je ne les ai pas créées moi même.
    Bien entendu elles sont simplifiées pour l'exemple (Transactions > 100 champs).

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Ok !

    Dommage que la table soit mal modélisée.
    donc oui votre requête de départ était sur la bonne piste.

    Est-ce que ceci fonctionne chez vous ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT O.nego_id, sum(objectif) ,
    SUM(COALESCE(T1.tra_honoraires1, 0)) +  SUM(COALESCE(T2.tra_honoraires2, 0)) 
    + SUM(COALESCE(T3.tra_honoraires3, 0)) + SUM(COALESCE(T4.tra_honoraires4, 0)) AS 'somme_objectifs'           
    FROM     Objectifs O
    LEFT JOIN Transactions T1 				ON O.nego_id = T1.tra_nego_honoraires1
    LEFT JOIN Transactions T2 				ON O.nego_id = T2.tra_nego_honoraires2
    LEFT JOIN Transactions T3 				ON O.nego_id = T3.tra_nego_honoraires3
    LEFT JOIN Transactions T4 				ON O.nego_id = T4.tra_nego_honoraires4                    
    WHERE     O.agence_id = 1
    GROUP BY  O.nego_id
    les COALESCE sont peut-être inutile, selon votre SGBD.

    Concernant le problème du mode agence, je penses que la requête que je vous ai proposée doit être bonne.


    edit : Si vous avez beaucoup de donnée, une consolidation en amont des honnoraires par négociant serai peut être intéresssante

    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
     
    with tmp (nego_id, honnoraire) as (
    select tra_nego_honoraires1, sum(tra_honoraires1)
    from transactions
    group by tra_nego_honoraires1
    union all 
    select tra_nego_honoraires2, sum(tra_honoraires2)
    from transactions
    group by tra_nego_honoraires2
    ...)
     
    SELECT O.nego_id, sum(objectif) ,sum(honnoraire)
    from objectifs O
    left outer join tmp trans on o.nego_id = trans.nego_id 
    group by O.nego_id

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

Discussions similaires

  1. requete sql max de sum/sum en gardant les autres infos
    Par gwena54 dans le forum Requêtes
    Réponses: 17
    Dernier message: 27/06/2007, 12h13
  2. [SQL] problème de SUM dans un update
    Par _Jérôme_ dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/03/2007, 18h22
  3. [SQL] Requête fonction SUM
    Par ribrok dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 17/01/2007, 16h45
  4. Requête SQL avec UNION, sum et GROUP BY
    Par Guitariff dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/12/2006, 13h48
  5. [SQL] Group by + SUM + Min
    Par Deejoh dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2006, 15h46

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