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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    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 actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    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 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    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 actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    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 actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    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 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    Merci, ca m'éclaire.
    Et en effet votre solution marche.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    J'ai essayer avec l'union mais g une erreur :

    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
     
    SELECT Clients.ID_Clients, Clients.Name_Client,
    	SUM(TOTAL_COMMANDES), SUM(TOTAL_FACTURES)
    FROM
    (
    	SELECT Clients.ID_Clients, Clients.Name_Client, SUM(Commandes.MontantTTC) TOTAL_COMMANDES, 0 TOTAL_FACTURES
    	FROM Clients AS Clients, Commandes AS Commandes
    	WHERE Clients.ID_Clients = Commandes.ID_Clients
    	GROUP BY Clients.ID_Clients, Clients.Name_Client
    	UNION
    	SELECT Clients.ID_Clients, Clients.Name_Client, 0 TOTAL_COMMANDES, SUM(Factures.MontantTTC) TOTAL_FACTURES
    	FROM  Clients AS Clients, Factures AS Factures
    	WHERE Clients.ID_Clients = Factures.ID_Clients
    	GROUP BY Clients.ID_Clients, Clients.Name_Client
    )
    	GROUP BY Clients.ID_Clients, Clients.Name_Client
    L'union entre les 2 requetes fonctionne mais la requete qui l'entoure ne fonctionne pas. Pourtant j'ai bien suivi votre exemple de code.

    Erreur :
    Line 14: Incorrect syntax near ')'.
    Merci.

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    D'abord, les colonnes de la requête principale viennent de l'union des deux sous-requêtes, pas de la table Clients.
    Ensuite essaie de mettre un alias après la dernière parenthèse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT ID_Clients, Name_Client,
    	TOTAL_COMMANDES, TOTAL_FACTURES
    FROM
    (
    	SELECT Clients.ID_Clients, Clients.Name_Client, SUM(Commandes.MontantTTC) TOTAL_COMMANDES, 0 TOTAL_FACTURES
    	FROM Clients AS Clients, Commandes AS Commandes
    	WHERE Clients.ID_Clients = Commandes.ID_Clients
    	GROUP BY Clients.ID_Clients, Clients.Name_Client
    	UNION
    	SELECT Clients.ID_Clients, Clients.Name_Client, 0 TOTAL_COMMANDES, SUM(Factures.MontantTTC) TOTAL_FACTURES
    	FROM  Clients AS Clients, Factures AS Factures
    	WHERE Clients.ID_Clients = Factures.ID_Clients
    	GROUP BY Clients.ID_Clients, Clients.Name_Client
    ) tmp

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    Merci.
    La solution avec l'union :
    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
     
    SELECT ID_Clients, Name_Client,
    	SUM(TOTAL_COMMANDES) C_TOTAL, SUM(TOTAL_FACTURES) F_TOTAL
    FROM
    (
    	SELECT Clients.ID_Clients, Clients.Name_Client, SUM(Commandes.MontantTTC) TOTAL_COMMANDES, 0 TOTAL_FACTURES
    	FROM Clients AS Clients, Commandes AS Commandes
    	WHERE Clients.ID_Clients = Commandes.ID_Clients
    	GROUP BY Clients.ID_Clients, Clients.Name_Client
    	UNION
    	SELECT Clients.ID_Clients, Clients.Name_Client, 0 TOTAL_COMMANDES, SUM(Factures.MontantTTC) TOTAL_FACTURES
    	FROM  Clients AS Clients, Factures AS Factures
    	WHERE Clients.ID_Clients = Factures.ID_Clients
    	GROUP BY Clients.ID_Clients, Clients.Name_Client
    ) TEMP
    GROUP BY ID_Clients, Name_Client;

+ 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