SQL сумма данных из нескольких таблиц - PullRequest
5 голосов
/ 07 апреля 2010

У меня есть 2 таблицы AP и INV, в которых есть столбцы [PROJECT] и [Value].

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

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

Ответы [ 6 ]

14 голосов
/ 07 апреля 2010

Результаты вашего запроса неверны, так как значения, которые вы пытаетесь суммировать, группируются, что приводит к включению повторяющихся значений в 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]
2 голосов
/ 07 апреля 2010

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

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

0 голосов
/ 12 августа 2012

как насчет этого запроса:

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 голосов
/ 07 апреля 2010

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

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 голосов
/ 07 апреля 2010

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

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 голосов
/ 07 апреля 2010

Попробуйте:

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