2010-04-07 3 views
5

У меня есть 2 таблицы AP и INV, где обе имеют столбцы [PROJECT] и [Value].sql сумма данных из нескольких таблиц

Я хочу, чтобы запрос, чтобы вернуть что-то вроде этого:

ПРОЕКТ | SUM_AP | SUM_INV

Я придумал код ниже, но он возвращает неправильные результаты (сумма неверна).

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] 

ответ

11

Результаты вашего запроса неверны, поскольку значения, которые вы пытаетесь суммировать, группируются, что приводит к включению дублирующих значений в SUM.

Вы могли бы решить с несколькими суб-выбирает:

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] 
+0

я получаю «Попытка выполнить запрос, который не включает указанное выражение„Project“в рамках совокупная функция ". – Iulian

+0

Я обновил второй подзапрос, чтобы избежать другого столбца группировки. Не могли бы вы попробовать еще раз? – Prutswonder

+0

теперь работает нормально, возвращая правильные результаты, спасибо – Iulian

2

Если у вас есть N строки в AP с данным проектом ID и M строки в INV с этим идентификатором, то соединение между двумя таблицами по проекту ID будет иметь в общей сложности N*M строк для этого проекта , потому что одна и та же строка в AP будет повторяться для каждой строки в INV, которая имеет этот идентификатор проекта, и наоборот. Следовательно, почему ваши подсчеты, скорее всего, отключены (потому что они подсчитывают одну и ту же строку в данной таблице несколько раз из-за повторения из соединения).

Вместо этого вы можете попробовать выполнить соединение между результатами двух подзапросов, которое группирует первую таблицу по идентификатору проекта и выполняет ее сумму, а второе, которое группирует другую таблицу по идентификатору проекта и делает это sum - затем соединение, когда у вас есть только 1 строка с суммой для каждого идентификатора проекта.

-1

Try:

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] 
+0

Это возвращает те же неправильные результаты, что и мои :( – Iulian

0

Если проект является родительской таблицей, вы должны выбрать из таблицы проекта, и сделать левое внешнее соединение на двух дочерних таблицах:

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] 
0

Вы можете разделить два вычисления суммы. Один из способов я могу думать о том, чтобы перейти на расчет запасов на вложенный запрос, например:

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 

Поскольку SummedInv подзапроса сгруппирован по project, это безопасно группе по SummedInv.SUM_INV во внешнем запросе, а также.

0

как об этом запросе:

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' 

здесь есть ссылка на ERD: http://dl.dropbox.com/u/18794525/AUG%207%20DUMP%20STAN.png

+0

Вы отправляете ERD из своей БД? Я думаю, что лучше ответить с информацией, которую предоставляет OP –

Смежные вопросы