7
votes

SQL SUM Data de plusieurs tables

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]


0 commentaires

6 Réponses :


2
votes

Si vous avez n lignes dans AP avec un ID de projet donné et m 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 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).

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.


0 commentaires

17
votes

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: xxx


2 commentaires

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?



-1
votes

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]


0 commentaires

0
votes

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]


0 commentaires

0
votes

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: xxx

car la sous-requête sommaireinv est regroupée sur Projet , il est sécuritaire de grouper sur sommaireinv.sum_inv dans la requête extérieure également.


0 commentaires

0
votes

Que diriez-vous de cette requête: xxx

Voici le lien vers l'ERD: http://dl.dropbox.com/u/18794525/aug%207%20Dump%20stan.png


1 commentaires

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