J'ai 2 tables AP et INV où les deux ont les colonnes [projet] et [valeur].
Je veux une requête pour retourner quelque chose comme ceci: P>
Projet | Sum_ap | Sum_inv p>
J'ai proposé le code ci-dessous, mais cela renvoie les mauvais résultats (la somme est incorrecte). P>
SELECT AP.[PROJECT], SUM(AP.Value) AS SUM_AP, SUM(INV.Value) AS SUM_INV FROM AP INNER JOIN INV ON (AP.[PROJECT] =INV.[PROJECT]) WHERE AP.[PROJECT] = 'XXXXX' GROUP BY AP.[PROJECT]
6 Réponses :
Si vous avez Au lieu de cela, vous voudrez peut-être essayer de faire une jointure entre les résultats de deux sous-candidats, une qui regroupe la première table par ID de projet et que sa somme et la seconde qui regroupe l'autre table par ID de projet et cette somme - Ensuite, rejoignez une fois que vous n'avez qu'une ligne avec une somme pour chaque ID de projet. P> n code> lignes dans AP avec un ID de projet donné et
m code> des lignes INV avec cet identifiant, puis la jointure entre les deux tables de l'ID de projet aura un total de lignes
n * m code> pour ce projet, car la même ligne de AP sera répétée pour chaque ligne de l'INV qui a cet identifiant de projet, et inversement. Par conséquent, pourquoi vos comptes sont probablement éteints (car cela comptait la même rangée dans une table donnée plusieurs fois en raison de la répétition de la jointure). P>
Les résultats de votre requête ont tort car les valeurs que vous essayez de résumer sont en cours de regroupement, ce qui provoque l'incluse des valeurs dupliquées dans la somme Vous pouvez le résoudre avec un couple des sous-sélectionnements: p> code>.
Je reçois "Vous avez essayé d'exécuter une requête qui n'inclut pas le« projet »d'expression spécifié dans le cadre d'une fonction agrégée."
J'ai mis à jour la deuxième sous-requête pour éviter une autre colonne de regroupement. Pourriez-vous essayer à nouveau?
Essayez:
SELECT AP.[PROJECT] AS PROJECT, SUM(AP.[Value]) AS SUM_AP, SUM(INV.[Value]) AS SUM_INV FROM AP, INV WHERE AP.[PROJECT] = INV.[PROJECT] AND AP.[PROJECT] = 'XXXXX' GROUP BY AP.[PROJECT]
Si le projet est la table des parents, vous devez sélectionner dans la table du projet et faire une jointure extérieure gauche sur les deux tables enfants:
SELECT PROJECT.PROJECT_ID, SUM(AP.Value) AS SUM_AP, SUM(INV.Value) AS SUM_INV FROM PROJECT LEFT OUTER JOIN AP ON (AP.[PROJECT] = PROJECT.[PROJECT_ID]) LEFT OUTER JOIN INV ON (INV.[PROJECT] = PROJECT.[PROJECT_ID]) WHERE PROJECT.[PROJECT_ID] = 'XXXXX' GROUP BY PROJECT.[PROJECT_ID]
Vous pouvez séparer les calculs de deux somme. Une façon de penser consiste à déplacer le calcul de l'inventaire à une sous-requête, comme: car la sous-requête sommaireinv code> est regroupée sur
Projet code >, il est sécuritaire de grouper sur
sommaireinv.sum_inv code> dans la requête extérieure également. p> p>
Que diriez-vous de cette requête: Voici le lien vers l'ERD: http://dl.dropbox.com/u/18794525/aug%207%20Dump%20stan.png p> p>
Vous postez un ERD de votre DB? Je pense qu'il est préférable de répondre avec les informations que la puissance fournit