Clause LEFT JOIN avec plusieurs tables et fonction Sum()

Résolu/Fermé
BiankaBo Messages postés 51 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 31 janvier 2024 - Modifié le 3 mars 2020 à 02:39
BiankaBo Messages postés 51 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 31 janvier 2024 - 3 mars 2020 à 21:45
Bonjour,

J'aurais une question par rapport à la clause LEFT JOIN.

Vous m'avez récemment aidé pour obtenir une somme grâce à la fonction sum() selon les données contenues dans une table jointe, et ce, avec succès. Le but était d'obtenir la somme des dépenses A reliées aux enregistrements contenus dans ma requête en plus de conserver les enregistrements de la requête qui ne possèdent pas de dépenses.

Cependant, lorsque j'essaie de joindre une deuxième table ou plus (car j'en aurais trois à joindre en réalité) de la même façon dans cette même requête afin d'obtenir la somme des dépenses B et C, les montants du champ calculé sont multipliés par deux. Ça affecte également le calcule des dépenses A. Pour le bien de l'exercice, commençons par essayer d'ajouter le calcul des dépenses B d'abord.

Voici les noms de mes objets en lien avec mon problème:
- Ma requête principale dans laquelle je souhaite instaurer les champs calculés [SOM_DA] et [SOM_DSA] se nomme [05-01-PLATEFORME].
- Les dépenses A proviennent de la table [07-DÉPENSES_AUTRES] et sont représentées par le champ [NET_DA] dont je souhaite faire la somme dans ma requête.
- Les dépenses B proviennent de la table [09-DÉPENSES_SAL_AUTRES] et sont représentées par le champ [Cout_DSA] dont je souhaite faire la somme de la même façon que les dépenses A.

Voici mon code SQL pour ma requête problématique:
SELECT [08_00-CHOIX_ALLOC_TABLE].No_AL, [06-ALLOCATIONS_BUDGET].NoET_AL, [03-ÉTABLISSEMENTS].Nom_ET, [08_00-CHOIX_ALLOC_TABLE].Expr1, [03-ÉTABLISSEMENTS].CoUT_ET, [02-UTILISATEURS].Nom_UT, [06-ALLOCATIONS_BUDGET].NoME_AL, [05-MESURES].Titre_ME, [05-MESURES].NoRM_ME, [04-REGROUPEMENTS_M].Titre_RM, [06-ALLOCATIONS_BUDGET].BudCal_AL, Sum([07-DÉPENSES_AUTRES].NET_DA) AS SOM_DA, Sum([09-DÉPENSES_SAL_AUTRES].Cout_DSA) AS SOM_DSA
FROM ([04-REGROUPEMENTS_M] 
INNER JOIN [05-MESURES] ON [04-REGROUPEMENTS_M].No_RM = [05-MESURES].NoRM_ME) 
INNER JOIN (([02-UTILISATEURS] 
INNER JOIN [03-ÉTABLISSEMENTS] ON [02-UTILISATEURS].Code_UT = [03-ÉTABLISSEMENTS].CoUT_ET) 
INNER JOIN ((([06-ALLOCATIONS_BUDGET] 
INNER JOIN [08_00-CHOIX_ALLOC_TABLE] ON [06-ALLOCATIONS_BUDGET].No_AL = [08_00-CHOIX_ALLOC_TABLE].No_AL) 
LEFT JOIN [07-DÉPENSES_AUTRES] ON [08_00-CHOIX_ALLOC_TABLE].No_AL = [07-DÉPENSES_AUTRES].[NoAL_DA]) 
LEFT JOIN [09-DÉPENSES_SAL_AUTRES] ON [08_00-CHOIX_ALLOC_TABLE].No_AL = [09-DÉPENSES_SAL_AUTRES].[NoAL_DSA]) ON [03-ÉTABLISSEMENTS].No_ET = [06-ALLOCATIONS_BUDGET].NoET_AL) ON [05-MESURES].No_ME = [06-ALLOCATIONS_BUDGET].NoME_AL
GROUP BY [08_00-CHOIX_ALLOC_TABLE].No_AL, [06-ALLOCATIONS_BUDGET].NoET_AL, [03-ÉTABLISSEMENTS].Nom_ET, [08_00-CHOIX_ALLOC_TABLE].Expr1, [03-ÉTABLISSEMENTS].CoUT_ET, [02-UTILISATEURS].Nom_UT, [06-ALLOCATIONS_BUDGET].NoME_AL, [05-MESURES].Titre_ME, [05-MESURES].NoRM_ME, [04-REGROUPEMENTS_M].Titre_RM, [06-ALLOCATIONS_BUDGET].BudCal_AL;


Et voici mon lien pour avoir accès à ma base de données:
https://drive.google.com/file/d/10j2a-5T7B67r9M4xeLkNqVaGPJD3wFLo/view?usp=sharing

Est-il possible d'éviter que les données se doublent ?

Merci beaucoup!! :)

2 réponses

yg_be Messages postés 22905 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 juin 2024 1 480
3 mars 2020 à 10:12
bonjour,
c'est possible, et assez simple. cela va aussi simplifier et clarifier les requêtes:
- il ne faut pas faire les LEFT JOIN et les sommes dans [05-01-PLATEFORME], il faut donc retirer cela de cette requête
- il faut faire une nouvelle requête qui utilise comme source les trois requêtes [05-01-PLATEFORME], 05_01-SOMME_DA et 05_01-SOMME_DSA.
0
BiankaBo Messages postés 51 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 31 janvier 2024
3 mars 2020 à 21:45
En effet ça fonctionne!!

Le pire dans tout ça c'est que je l'avais essayé.. Ce qui n'avait pas marché était lié au fait que ça indiquait "Regroupement" dans le type d'opération alors que j'avais simplement à le changer pour "Expression".

Un gros merci encore, ton aide est très appréciée!
0