2010-04-07 22 views
5

我有2個表AP和INV,其中都有列[PROJECT]和[VALUE]。來自多個表的sql總和數據

我想要一個查詢返回如下內容:

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] 

回答

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

我得到「試圖執行一個查詢,不包括指定表達式‘項目’作爲其一部分一個集合函數「。 – Iulian 2010-04-07 10:24:16

+0

我更新了第二個子查詢以避免另一個分組列。你能再試一次嗎? – Prutswonder 2010-04-07 10:28:38

+0

它現在工作正常,返回正確的結果,謝謝 – Iulian 2010-04-07 10:34:10

2

如果在AP N行與給定的項目ID,並在與該ID INV M行,那麼該項目ID兩個表之間的連接將擁有該項目共N*M行,因爲對於具有該項目ID的INV中的每一行,AP中的相同行將被重複,反之亦然。因此,爲什麼你的計數很可能是關閉的(因爲它是連續重複計算多次給定表中的同一行)。

相反,您可能想嘗試在兩個子查詢的結果之間進行連接,一個按項目ID對第一個表進行分組,然後按項目ID對其他表進行分組,然後執行該操作總和 - 然後加入一次,每個項目ID只有1行總和。

-1

嘗試:

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 2010-04-07 10:24:55

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提供的信息回答 – 2012-09-28 14:09:40