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] - Probleme de requete avec SUM


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Par défaut [SQL] - Probleme de requete avec SUM
    Bonjour,

    J'ai un probleme pour ma requete que je ne sais pas resoudre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT	Clients.ID_Clients, Clients.Name_Client,
    	SUM(Commandes.MontantTTC) AS TOTAL_COMMANDES/*,*/
    	/*SUM(Factures.MontantTTC) AS TOTAL_FACTURES*/
    FROM 	Clients Clients, Commandes Commandes/*, Factures Factures*/
    WHERE   Clients.ID_Clients = Commandes.ID_Clients
    /*AND 	Clients.ID_Clients = Factures.ID_Clients*/
    GROUP BY Clients.ID_Clients, Clients.Name_Client;
    La requete avec 1 SUM marche mais avec le 2éme SUM, les valeurs ne sont pas correctes, elles sont multipliees par 2.
    Il doit y avoir une erreur de doublons qu'il faut gerer je pense.

    Anyone can help me ?

    Merci.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Par défaut
    J'ai trouve une solution, je ne sais pas si c'est comme ca qu'on doit faire mais ca marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT	Clients.ID_Clients, Clients.Name_Client,
    	ISNULL((SELECT SUM(MontantTTC) FROM Factures WHERE ID_Clients = Clients.ID_Clients), 0) AS TOTAL_FACTURES,
    	ISNULL((SELECT SUM(MontantTTC) FROM Commandes WHERE ID_Clients = Clients.ID_Clients), 0) AS TOTAL_COMMANDES
    FROM 	Clients Clients;
    A+

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il y a plusieurs autres méthodes, union, jointure externe ou sous-requête qui je pense sont plus performantes que votre solution (il faudrait vérifier avec le plan d'exécution et bien entendu le temps de réponse).

    En restant si vous me le permettez à haut niveau, celà donnerait quelque chose de ce genre :

    UNION :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select client, sum(commandes), sum(factures)
    from
    (
      select client, sum(commandes), 0
      from clients, commandes
      UNION
      select clients, 0, sum(factures)
      from clients, factures
    )
    JOINTURE EXTERNE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select client, sum(si commande alors commande sinon 0), sum(si facture alors facture sinon 0)
    from clients
        left join commandes
        left join factures
    SOUS-REQUETES :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select client, commandes_tot, factures_tot
    from client
        left join (select id_client, sum(commandes) from commandes)
        left join (select id_client, sum(factures) from factures)

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Par défaut
    Bonjour,

    Merci pour ces solutions mais je n'arrive a en faire marcher aucune.
    Je suis sous SqlServer 2000.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Par défaut
    Bonjour,

    j'ai essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT 	Clients.ID_Clients,
    	Clients.Name_Client,
    	SUM(Factures.MontantTTC) AS TOTAL_FACTURES/*,
    	SUM(Commandes.MontantTTC) AS TOTAL_COMMANDES*/
    FROM Clients
    LEFT JOIN Factures
    ON Clients.ID_Clients = Factures.ID_Clients
    /*LEFT JOIN Commandes
    ON Clients.ID_Clients = Commandes.ID_Clients*/
    GROUP BY Clients.ID_Clients, Clients.Name_Client;
    Si j'enleve les commentaires ca multiplie mes valeurs par 2 comme avant.
    Je ne sais pas ce qu'il faut rajouter.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je vous ai proposé des méthodes, aucunement du code à copier-coller.

    Par exemple la proposition sous-requête donnerait pour vous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT
        C.ID_Clients,
        C.Name_Client,
        M.commandes_tot,
        F.factures_tot
    FROM
        Clients AS C
        LEFT JOIN (SELECT ID_Clients, sum(MontantTTC) AS commandes_tot
                   FROM Commandes GROUP BY ID_Clients) AS M
          ON M.ID_Clients= C.ID_Clients
        LEFT JOIN (SELECT ID_Clients, sum(MontantTTC) AS factures_tot
                   FROM Factures GROUP BY ID_Clients) AS F
          ON F.ID_Clients= C.ID_Clients

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/12/2005, 10h53
  2. [JSP][SQL]Probleme de guillemets avec SQL
    Par Drizzt [Drone38] dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 29/08/2005, 18h39
  3. [Hibernate]Probleme de requete avec un "or"[\Hiber
    Par crips dans le forum Hibernate
    Réponses: 5
    Dernier message: 07/07/2005, 03h28
  4. Probleme de requetes avec SQLQuery
    Par Floverdoz dans le forum Bases de données
    Réponses: 19
    Dernier message: 01/06/2005, 16h43
  5. probleme de requete avec reprise du resultat :
    Par Maxoo dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/12/2004, 20h05

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