tablas - consultas sql pdf
datos de suma sql de varias tablas (6)
Los resultados de su consulta son incorrectos porque los valores que intenta resumir se agrupan, lo que hace que los valores duplicados se incluyan en la SUM
.
Podrías resolverlo con un par de sub-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]
Tengo 2 tablas AP e INV donde ambas tienen las columnas [PROYECTO] y [Valor].
Quiero una consulta para devolver algo como esto:
PROYECTO | SUM_AP | SUM_INV
Se me ocurrió el siguiente código pero está devolviendo los 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]
Podrías separar los dos cálculos de suma. Una manera en que puedo pensar es mover el cálculo de inventario a 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
está agrupada en el project
, también es seguro agrupar en SummedInv.SUM_INV
en la consulta externa.
Si PROJECT es la tabla principal, debe seleccionar FROM de la tabla del proyecto 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]
Si tiene N
filas en AP con una ID de proyecto determinada y M
filas en INV con esa ID, entonces la unión entre las dos tablas en la ID de proyecto tendrá un total de N*M
filas para ese proyecto, porque la misma fila en AP se repetirá por cada fila en INV que tenga esa ID de proyecto, y viceversa. Por lo tanto, es probable que sus recuentos estén desactivados (porque está contando la misma fila en una tabla dada varias veces debido a la repetición de la unión).
En su lugar, puede intentar hacer una combinación entre los resultados de dos subconsultas, una que agrupa la primera tabla por ID de proyecto y la suma, y la segunda que agrupa la otra tabla por ID de proyecto y hace esa suma, luego unirse una vez que solo tiene 1 fila con suma para cada ID de proyecto.
Tratar:
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]
¿Qué 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''
aquí está el enlace al ERD: http://dl.dropbox.com/u/18794525/AUG%207%20DUMP%20STAN.png