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 et SQL. Discussion :

Fonction d'agrégation sum sur plusieurs tables sans cumul [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 24
    Points : 22
    Points
    22
    Par défaut Fonction d'agrégation sum sur plusieurs tables sans cumul
    Bonjour à toutes et tous,

    Exemple:
    Je fais partie d'un établissement faisant appel à des fournisseurs externes de matériels.

    J'ai deux tables. Une table COMMANDES (celle que nous passons) et une LIQUIDATIONS (celle pour payer les fournisseurs)
    La première table contient les champs NUM_CMD (clé primaire) et MNT_ENGAG (le montant engagé)
    La seconde table contient les champs NUM_LIQ (clé primaire), MNT_LIQ (le montant payé au fournisseur) et NUM_CMD (clé étrangère liée à COMMANDES)

    Je dois faire un tableau récapitulatif (en VB.NET dans un DataGridView) grâce à une requête SQL.
    Voici la mienne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select C.NUM_CMD, sum(C.MNT_ENGAG) as Engagé, sum(L.MNT_LIQ) as Liquidé, sum(C.MNT_ENGAG)-sum(L.MNT_LIQ) as Reste from ((COMMANDES C) left join LIQUIDATIONS L on (L.NUM_CMD=C.NUM_CMD)) group by C.NUM_CMD, L.NUM_LIQ
    Seulement voilà, il peut arriver qu'il y ai plusieurs liquidations pour une même commande. Par exemple, j'ai engagé un montant de 1000€ dans des fournitures et j'ai été livré en 3 fois. Donc, 3 liquidations différentes de (toujours en exemple) 500, 300 et 200€.
    Et c'est là que ma requête ne fonctionne plus. Puisque j'ai 3 lignes de liquidations, il me compte 3 fois mon engagement. Ici, 3x1000=3000€ !

    Y'a-t-il une solution pour que mon engagement reste à 1000€ ?

    Merci d'avance...

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 803
    Points : 14 871
    Points
    14 871
    Par défaut
    Bonjour,
    si MNT_ENGAG est unique pour chaque NUM_CMD il faut mettre First(MNT_ENGAG) à la place de Sum().

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    Bonjour,
    si MNT_ENGAG est unique pour chaque NUM_CMD il faut mettre First(MNT_ENGAG) à la place de Sum().
    Bonjour et merci de ta rapide réponse.

    Oui, le MNT_ENGAG est unique pour chaque NUM_CMD.

    En fait, ta réponse m'a permis de constater que j'ai oublié un critère dans ma table COMMANDE: le champs CODE_FOURN.
    Maintenant, je veux faire la somme des montants engagés, des montants liquidés et des restes par fournisseurs.

    Du coup, First ne fonctionne plus...

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 803
    Points : 14 871
    Points
    14 871
    Par défaut
    En fait, ta réponse m'a permis de constater que j'ai oublié un critère dans ma table COMMANDE: le champs CODE_FOURN.
    Maintenant, je veux faire la somme des montants engagés, des montants liquidés et des restes par fournisseurs.

    Du coup, First ne fonctionne plus...
    je ne sais pas... peut-être faut-il commencer par une première requête qui somme les liquidations par commande/fournisseurs, et ensuite faire la jointure avec les engagements ?
    Il faudrait un aperçu du modèle de données et des exemples de cas concrets.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    Il faudrait un aperçu du modèle de données et des exemples de cas concrets.
    Ci-dessous un modèle créé avec JMerise:
    Nom : Sommes commandes et liquidations.jpg
Affichages : 340
Taille : 25,3 Ko

    On voit que FOURNISSEURS peut (et aura) plusieurs commandes et que celles-ci peuvent avoir plusieurs liquidations (paiements).
    Je veux pouvoir, par FOURNISSEURS, faire la somme totale des MNT_TTC des commandes et la somme totale des MNT_TTC des liquidations/commande.

    Hors, actuellement, le MNT_TTC d'une commande est multiplié par le nombre de liquidation de cette même commande.
    Ces données sont destinées à remplir le datasource d'un datagridview. Elles doivent par conséquent faire partie d'une seule et même requête.
    Comment y remédier? Requêtes imbriquées?

    Une aide serait la bienvenue...

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 803
    Points : 14 871
    Points
    14 871
    Par défaut
    Bonsoir,
    Dans ce cas, il faut commencer par sommer ce qui risque de faire des multiplications de montants : les liquidations, les commandes
    On fait donc une première requète qu'on appelera RQ_LIQCMD et qui fait un regroupement par Fournisseur / Commandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COMMANDES.ID_FOURNISSEURS, COMMANDES.Num, First(COMMANDES.MNT_TTC) AS Tot_ENGAGE, Sum(LIQUIDATIONS.MNT_TTC) AS Tot_LIQUIDE, First([COMMANDES].[MNT_TTC])-Sum([LIQUIDATIONS].[MNT_TTC]) AS Tot_RESTE
    FROM COMMANDES LEFT JOIN LIQUIDATIONS ON COMMANDES.Num = LIQUIDATIONS.NUM_COMMANDES
    GROUP BY COMMANDES.ID_FOURNISSEURS, COMMANDES.Num;
    que l'on utilisera ensuite pour le calcul final par fournissseur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT FOURNISSEURS.Id, FOURNISSEURS.Nom_Fourn, Sum(RQ_LIQCMD.Tot_ENGAGE) AS Engagé, Sum(RQ_LIQCMD.Tot_LIQUIDE) AS Liquidé, Sum(RQ_LIQCMD.Tot_RESTE) AS Reste
    FROM FOURNISSEURS INNER JOIN RQ_LIQCMD ON FOURNISSEURS.Id = RQ_LIQCMD.ID_FOURNISSEURS
    GROUP BY FOURNISSEURS.Id, FOURNISSEURS.Nom_Fourn;

  7. #7
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    GÉ-NIA-LEU !!!

    C'est exactement ce que je voulais. Tout simplement parfait !

    Pour mon cas, je vais quand même expliquer la méthode que j'ai utilisée:
    1. J'ai créé la première requête dans Access
    2. Dans VB.NET, j'écris la deuxième requête, appelant ainsi la première. Avec pour avantage de pouvoir ajouter des critères de filtrage (having)



    Merci tee_grandbois...

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

Discussions similaires

  1. COUNT sur plusieurs tables sans lien
    Par meixj dans le forum SQL
    Réponses: 1
    Dernier message: 24/03/2014, 13h36
  2. requete sur plusieurs tables sans inner join?
    Par polo86 dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/04/2009, 15h10
  3. select sur plusieurs table sans jointure
    Par oska06 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/09/2008, 11h04
  4. Réponses: 5
    Dernier message: 10/05/2008, 18h11
  5. Réponses: 2
    Dernier message: 10/05/2008, 17h53

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