Pregunta

Tengo 2 tablas AP e INV donde ambas tienen las columnas [PROYECTO] y [Valor].

Quiero que una consulta devuelva algo como esto:

Proyecto | SUM_AP | Sum_inv

Se me ocurrió el siguiente código pero arroja resultados incorrectos (la suma es incorrecta).

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

Solución

Los resultados de la consulta se equivocan porque los valores que están tratando de resumir se agrupan, lo que provoca valores duplicados para ser incluido en el SUM.

Se podría resolver con un par de sub-selecciona:

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]

Otros consejos

Si usted tiene N filas en AP con un ID de proyecto determinado, y M filas en INV con esa ID, entonces la unión entre las dos tablas en la ID del proyecto tendrá un total de N*M filas para ese proyecto, porque la misma fila en AP se repetirá para cada fila en INV que tenga ese ID de proyecto, y viceversa.De ahí que lo más probable es que sus recuentos estén incorrectos (porque está contando la misma fila en una tabla determinada varias veces debido a la repetición de la combinación).

En su lugar, es posible que desee intentar hacer una unión entre los resultados de dos subconsultas, una que agrupa la primera tabla por ID de proyecto y suma, y ​​la segunda que agrupa la otra tabla por ID de proyecto y suma, luego unir una vez que solo tenga 1 fila con la suma para cada ID de proyecto.

Si el proyecto es la tabla primaria, se debe seleccionar de la tabla de proyectos, y hacer una combinación externa izquierda en las dos tablas secundarias:

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]

Se puede separar los dos cálculos de suma. Una forma que se me ocurre es mover el cálculo de inventario para una 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

Debido a que la subconsulta SummedInv se agrupa en project, que es seguro grupo en SummedInv.SUM_INV en la consulta externa también.

¿qué hay de 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'

aquí está el enlace a la ERD: http: // dl.dropbox.com/u/18794525/AUG%207%20DUMP%20STAN.png

Trate:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top