Question

J'ai 2 tables AP et INV où les deux ont les colonnes [PROJET] et [Valeur].

Je veux une requête pour renvoyer quelque chose comme ceci:

PROJET | SUM_AP | SUM_INV

Je suis venu avec le code ci-dessous, mais il est de retour les mauvais résultats (somme est erroné).

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]
Était-ce utile?

La solution

Les résultats de votre requête sont erronés parce que les valeurs que vous essayez de résumer sont regroupés, ce qui provoque des doublons à inclure dans le SUM.

Vous pouvez le résoudre avec deux sous-Selects:

SELECT 
    AP1.[PROJECT],
    (SELECT SUM(AP2.Value) FROM AP AS AP2 WHERE AP2.PROJECT = AP1.PROJECT) AS SUM_AP,
    (SELECT SUM(INV2.Value) FROM INV AS INV2 WHERE INV2.PROJECT = AP1.PROJECT) AS SUM_INV
FROM AP AS AP1 
    INNER JOIN INV AS INV1 
        ON (AP1.[PROJECT] =INV1.[PROJECT])
WHERE AP1.[PROJECT] = 'XXXXX'
GROUP BY AP1.[PROJECT]

Autres conseils

Si vous avez N lignes dans AP avec un ID de projet donné, et les lignes de M en INV avec cet ID, la jointure entre les deux tables sur l'ID du projet aura un total de lignes de N*M pour ce projet, parce que le même ligne de point d'accès sera répété pour chaque ligne de INV qui a cet ID de projet, et vice versa. Dès lors, pourquoi vos comptes sont les plus susceptibles de (parce qu'il compte sur la même ligne dans une table à plusieurs reprises en raison de la répétition de la jointure).

Au lieu de cela, vous pouvez essayer de faire une jointure entre les résultats de deux sous-requêtes, dont l'un des groupes de la première table par ID de projet et ne que sa somme, et le second qui regroupe l'autre table par ID de projet et ne cette somme - rejoindre alors une fois que vous avez seulement 1 rang avec somme pour chaque ID de projet

.

Si le projet est la table parent, vous devez sélectionner à partir de la table de projet, et faire une jointure externe gauche sur les deux tables de l'enfant:

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 deux calculs de somme. Une façon je peux penser est de déplacer le calcul des stocks à un sous-requête, comme:

SELECT 
    AP.[PROJECT]
,   SUM(AP.Value) AS SUM_AP
,   SummedInv as SUM_INV
FROM AP
LEFT JOIN (
    SELECT PROJECT, SUM(Value) AS SUM_INV
    FROM INV
    GROUP BY PROJECT
) SummedInv ON SummedInv.Project = AP.Project
GROUP BY AP.PROJECT, SummedInv.SUM_INV

Parce que la sous-requête SummedInv est regroupée sur project, il est sûr de groupe sur SummedInv.SUM_INV dans la requête externe ainsi.

Que diriez-vous cette requête:

select SUM(gpCutBody.actualQty) as cutQty   , SUM(gpSewBody.quantity) as sewQty

from jobOrder
inner join gpCutHead on gpCutHead.joNum = jobOrder.joNum
inner join gpSewHead on gpSewHead.joNum = jobOrder.joNum

inner join gpCutBody on gpCutBody.gpCutID = gpCutHead.gpCutID
inner join gpSewBody on gpSewBody.gpSewID = gpSewHead.gpSewID


where jobOrder.joNum = '36'

Voici le lien vers la DRE: http: // dl.dropbox.com/u/18794525/AUG%207%20DUMP%20STAN.png

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]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top