Domanda

Ho 2 tabelle di AP e INV in cui entrambi hanno le colonne [Progetto] e [valore].

Voglio una query per restituire qualcosa di simile:

PROGETTO | SUM_AP | SUM_INV

mi si avvicinò con il codice qui sotto ma è restituire i risultati errati (somma è sbagliato).

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]
È stato utile?

Soluzione

I risultati di query sono sbagliato, perché i valori che si sta tentando di riassumere vengono raggruppati, che fa sì che i valori duplicati da inserire nel SUM.

Si potrebbe risolvere con un paio di sub-select:

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]

Altri suggerimenti

Se si dispone di file N in AP con un dato ID del progetto, e le righe M in INV con quel ID, quindi il join tra le due tabelle sul ID progetto avrà un totale di righe N*M per quel progetto, perché lo stesso riga AP verrà ripetuta per ogni riga INV che ha quel ID progetto, e viceversa. Da qui il motivo per cui la conta sono molto probabilmente fuori (perché è il conteggio della stessa riga in una determinata tabella più volte a causa di ripetizione dal punto di giunzione).

Al contrario, si potrebbe desiderare di provare a fare un join tra i risultati di due subquery, una che i gruppi della prima tabella di ID del progetto e fa che la sua somma, e la seconda, che i gruppi l'altra tabella per ID progetto e fa tale somma -. poi entrare una volta che hai solo 1 riga con somma per ogni ID progetto

Se PROJECT è la tabella padre, è necessario selezionare dal tavolo di progetto, e fare un join esterno sinistro sulle due tabelle figlio:

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]

Si potrebbe separare i due calcoli somma. Un modo mi viene in mente è quello di spostare il calcolo inventario per una sottoquery, come:

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

Perché il subquery SummedInv è raggruppato su project, è sicuro di gruppo sul SummedInv.SUM_INV nella query esterna pure.

come su questa domanda:

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'

ecco il link per il disco di ripristino: http: // dl.dropbox.com/u/18794525/AUG%207%20DUMP%20STAN.png

Prova:

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]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top