Данные SQL Sum из нескольких таблиц
-
25-09-2019 - |
Вопрос
У меня есть 2 таблицы AP и INV, где оба имеют столбцы [проект] и [значение].
Я хочу запрос, чтобы вернуть что-то вроде этого:
Проект |. 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]
Решение
Результаты вашего запроса неверны, потому что значения, которые вы пытаетесь обобщить, вызывают группируемые, что вызывает включение дублирующих значений в 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]
Другие советы
Если у тебя есть N
строки в AP с данным ID проекта и M
строки в инверсии с этим идентификатором, то соединение между двумя таблицами на ID проекта будет иметь в общей сложности N*M
Строки для этого проекта, потому что тот же строк в AP будет повторяться для каждой строки в ENV, который имеет этот идентификатор проекта и наоборот. Следовательно, почему ваши значения скорее всего выключены (потому что это подсчитывает один и тот же строк в данной таблице несколько раз из-за повторения с присоединения).
Вместо этого вы можете попробовать выполнить присоединение между результатами двух подзапросов, которые группируют первую таблицу по идентификатору проекта и делают это его сумму, а второй, которые группируют другую таблицу по ID проекта и делают эту сумму - затем присоединяться Как только у вас есть только 1 ряд с суммой для каждого идентификатора проекта.
Если Project является родительской таблицей, вы должны выбрать из таблицы проекта и сделать левый внешний присоединение к двум дочерним столам:
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]
Вы могли бы разделить две суммы расчеты. Один из способов думать, - это переместить расчет инвентаризации в подзапрос, как:
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
во внешнем запросе тоже.
Как насчет этого запроса:
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.
Пытаться:
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]