datos de suma SQL de varias tablas
-
25-09-2019 - |
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]
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]