2013-10-22 2 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에 대해 여러 항목이 있습니다. 이 값은 양수 및 음수 일 수 있습니다. 음수 값은 정정을 나타내며 이에 따라 해당 양수 값은 "0이됩니다".

지금 질문해야하는 것은 customerID 당 모든 최대 값의 최대 값입니다. 위의 예에서 customerID 123456789의 최대 값은이 고객 ID의 다른 모든 값이 서로를 무효화하기 때문에 200입니다. 따라서 고객 ID 987654321의 최대 값은 210입니다.

궁극적으로 내 쿼리는 음수 값으로 수정/정정되지 않은 customerID 당 모든 최대 값 중에서 최대 값 210을 반환해야합니다.

도와 주시겠습니까?

편집 : SUM()이 여기에서 작동하지 않는다는 것을 명확히하기 위해 두 고객 ID에 200과210 값을 추가했습니다.

편집 # 2 :, 그냥 모든 음의 값이 1 개에 대응 동일한 양의 값은 짝이 있다고 가정 것 http://pastebin.com/TbNRTw5A

답변

1

이 당신의 해답이 될 것인지 모르겠어요 : 여기에 몇 가지 (거의) 실제 데이터입니다.

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

그래서 결과는 다음과 같습니다

CustomerID Value 
123456789 200 
987654321 210 

희망이이 방법에 대해


을하는 데 도움이? 위의 질의에 대한 내가 가진

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 

그리고 결과 :

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 MaxValue 
-------------------- 
123456789 200 
987654321 1250 
+0

그건 문제입니다. 양수 값만 있고 그에 상응하는 음수 값이없는 고객 ID가있을 수 있습니다. 이 양수 값은 정확히 동일 할 수 있으므로 여러 개의 중복 항목이 있습니다. 그리고 기록을 위해 나는 그 데이터베이스를 만들지 않습니다. ;-) – Popopinsel

+0

@Popopinsel 가입 할 필요가 없습니다. 양수/음 쌍은 동일한 CustomerID에 속해 있기 때문에 SUM()이 수행 될 때 서로를 취소합니다. 즉, 해당 쿼리가 GROUP BY를 수행하는 방식입니다. 그런 다음, (CustomerID 당) 쿼리가 반환하는 값의 최대 값을 찾으려면 다른 SELECT MAX (Value) ... 쿼리로 래핑하면됩니다. –

+0

그러나 양수 값과 음수 값 쌍이없고 양수 값 (양 또는 같음)이없는 경우 SUM()은 최대 값을 반환하지 않습니다. 분명히 대신 모든 양수 값의 합계를 반환합니다. – Popopinsel