2013-10-22 51 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