Pergunta

Eu tenho 2 tabelas AP e Inv, onde ambas têm as colunas [Project] e [Value].

Eu quero uma consulta para devolver algo assim:

Projeto | Sum_ap | Sum_inv

Eu criei o código abaixo, mas ele está retornando os resultados errados (a soma está errada).

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]
Foi útil?

Solução

Os resultados da sua consulta estão errados porque os valores que você está tentando resumir estão sendo agrupados, o que faz com que valores duplicados sejam incluídos no SUM.

Você pode resolvê-lo com alguns subselitos:

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]

Outras dicas

Se você tem N linhas em AP com um determinado ID do projeto e M linhas em inv com esse id, então a junção entre as duas tabelas no ID do projeto terá um total de N*M As linhas para esse projeto, porque a mesma linha no AP será repetida para cada linha no Inv que possui esse ID do projeto e vice -versa. Portanto, por que suas contagens provavelmente estão fora (porque contando a mesma linha em uma determinada tabela várias vezes devido à repetição da junção).

Em vez disso, você pode querer tentar fazer uma junção entre os resultados de duas subconsivas, uma que agrupa a primeira tabela por ID do projeto e faz isso é sua soma, e a segunda que agrupa a outra tabela por ID do projeto e faz essa soma - depois se juntando Depois de ter apenas 1 linha com soma para cada ID do projeto.

Se o projeto for a tabela pai, você deve selecionar na tabela do projeto e fazer uma junção externa esquerda nas duas tabelas infantis:

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]

Você pode separar os dois cálculos da soma. Uma maneira de pensar é mover o cálculo do inventário para uma subconsulta, como:

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

Porque o SummedInv A subconsência está agrupada em project, é seguro agrupar em SummedInv.SUM_INV na consulta externa também.

Que tal esta consulta:

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'

Aqui está o link para o ERD: http://dl.dropbox.com/u/18794525/aug%207%20dump%20stan.png

Tentar:

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]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top