2013-10-22 49 views
0

我很努力地使用此特定的Access 2010 SQL查詢很長時間了。讓我先告訴你我的表格是什麼樣子的:SQL查詢最大限度地獲得每個客戶的所有最大值

customerID  value 
123456789  100 
123456789  -100 
123456789  300 
123456789  -300 
123456789  150 
123456789  -150 
123456789  200 
123456789  200 
987654321  500 
987654321  -500 
987654321  200 
987654321  -200 
987654321  210 
987654321  210 

您看到我有多個條目,其中有多個值。這些值可以是正面和負面的。負值表示更正,因此相應的正值「變爲零」。

我現在需要查詢的是每個customerID所有最大值的最大值。在上面的示例中,customerID 123456789的最大值是200,因爲此customerID上的所有其他值都彼此取消。因此,客戶ID 987654321上的最大值爲210.

最終,我的查詢應該返回值210作爲每個customerID的所有最大值中的最大值,這些值沒有被負值更正/取消。

你能幫我解決嗎?

編輯:添加(重複)值200和210到兩個customerIDs,以明確SUM()不會在這裏工作。

編輯#2:下面是一些(幾乎)現實生活中的數據:http://pastebin.com/TbNRTw5A

回答

1

我不知道這是否會是你的答案,它只是假設所有負值有1個對應相等正值配對。

SELECT CustomerID, SUM(Stack1.Value) FROM Stack1 
GROUP BY CustomerID 

那麼結果將是:

CustomerID Value 
123456789 200 
987654321 210 

希望這有助於


這個怎麼樣?

WITH tmpPositive AS (SELECT 
    Stack1.CustomerID, Stack1.Value FROM Stack1 WHERE Stack1.Value > 0), 
    tmpNegative AS (SELECT 
    Stack1.CustomerID, Stack1.Value FROM Stack1 WHERE Stack1.Value < 0) 
SELECT tmpPositive.CustomerID, MAX(tmpPositive.Value) AS MaxValue FROM tmpPositive 
LEFT OUTER JOIN tmpNegative 
ON tmpPositive.CustomerID = tmpNegative.CustomerID AND 
    -tmpPositive.Value = tmpNegative.Value 
WHERE tmpNegative.CustomerID IS NULL 
GROUP BY tmpPositive.CustomerID; 

這裏的測試數據:

CustomerID Value 
--------------------- 
123456789 100 
123456789 -100 
123456789 300 
123456789 -300 
123456789 150 
123456789 -150 
123456789 200 
987654321 500 
987654321 -500 
987654321 200 
987654321 -200 
987654321 210 
123456789 200 
123456789 110 
987654321 1250 

而結果我對上面的查詢。

CustomerID MaxValue 
-------------------- 
123456789 200 
987654321 1250 
+0

這就是問題所在。可能有客戶ID只有正值,並且沒有相應的負值,我認爲這會加入難度。這些正值也可能完全相同,因此有多個完全重複的條目。 而只是爲了記錄我不建立該數據庫。 ;-) – Popopinsel

+0

@Popopinsel您不需要進行連接。當執行SUM()時,正/負對相互抵消,因爲它們屬於同一個CustomerID,這就是查詢執行GROUP BY的方式。然後,如果您想查找該(per-CustomerID)查詢返回的最大值,只需將其包裝在另一個「SELECT MAX(Value)...」查詢中。 –

+0

但是,如果沒有正值和負值對,但只有正值(不論相同或不同),則SUM()不會返回最大值。顯然它會返回所有正值的總和。 – Popopinsel