2012-10-31 4 views
2

아래의 예제 테이블에서 'C'가 id ​​내에 존재하지 않는 모든 기호에 대해 id보다 많은 금액을 계산하는 방법을 찾으려고합니다. . 'C'마크가 ID에 존재할 때, 마크 'A'에 대한 금액을 제외한 해당 ID에 대한 총 금액을 원합니다. 예를 들어, 원하는 출력은 맨 아래에 있습니다. 파티션 및 EXISTS 명령 사용을 고려했지만 솔루션을 개념화하는 데 문제가 있습니다. 당신이 중 하나를 살펴보고 올바른 방향으로 날 지점 수 있다면, 그것은 크게 감상 할 수있다 :)다른 그룹이있는 경우 그룹의 레코드 제외 값

샘플 테이블 :

id mark amount 
------------------ 
1 A  1 
2 A  3 
2 B  2 
3 A  2 
4 A  1 
4 B  3 
5 A  1 
5 C  3 
6 A  2 
6 C  2 

원하는 출력 :

id sum(amount) 
----------------- 
1 1 
2 5 
3 2 
4 4 
5 3 
6 2 

답변

0
select 
    id, 
    case 
    when count(case mark when 'C' then 1 else null end) = 0 
    then 
     sum(amount) 
    else 
     sum(case when mark <> 'A' then amount else 0 end) 
    end 
from sampletable 
group by id 
+0

두 번째'sum'은 다음과 같이 읽어야합니다 :'sum (마커 <> 'A' 'then amount else 0 end)'('1' 대신에'amount'이어야합니다). –

+0

@AndriyM 러쉬 실수. –

+0

@Adrian, 답장을 보내 주셔서 감사합니다. 귀하의 솔루션을 구현 한 후에 나는 잘못된 질문을 한 것을 깨달았습니다! 이 솔루션은 내가 요청한 것을 정확하게 수행하지만, 내가 무엇을 요구했는지는 내가 필요한 것이 아니다 :). 만약 당신이 다른 것을 시도 할 마음이 있다면, 나는 [link] (http://stackoverflow.com/questions/13169830/exclude-value-of-a-record-in)에서 실제 요구 사항을 가지고 새로운 질문을 던졌습니다. -a-group-if-another-is-present-v2) –

0

여기 내 노력이있다 :

select id, sum(amount) from table t where not t.id = 'A' group by id 
having id in (select id from table t where mark = 'C') 
union 
select id, sum(amount) from table t where t.id group by id 
having id not in (select id from table t where mark = 'C') 
0
SELECT 
    id, 
    sum(amount) AS sum_amount 
FROM atable t 
WHERE mark <> 'A' 
    OR NOT EXISTS (
    SELECT * 
    FROM atable 
    WHERE id = t.id 
     AND mark = 'C' 
) 
GROUP BY 
    id 
; 
관련 문제