SQL查询以获得每个客户的所有最大值

时间:2013-10-22 09:17:35

标签: sql group-by ms-access-2010 max greatest-n-per-group

我正在努力解决这个特定的Access 2010 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的所有最大值的最大值。在上面的示例中,customerID 123456789的最大值为200,因为此customerID上的所有其他值均相互消除。因此,customerID 987654321上的最大值为210。

最终,我的查询应该返回210的值,作为每个customerID的所有最大值中的最大值,这些值不会被负值校正/取消。

你能帮我解决这个问题吗?

编辑:向两个customerID添加(重复)值200和210,以明确SUM()在这里不起作用。

编辑#2:这是一些(几乎)现实生活中的数据:http://pastebin.com/TbNRTw5A

1 个答案:

答案 0 :(得分: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