2014-03-03 5 views
1

그런 쿼리를 만들 수 있는지 궁금합니다. 문제는 제가 테이블에 날짜가있는 숫자가 있다는 것입니다.postgres 복잡한 쿼리

즉 나쁜/좋은 일, 가치 : 내가 3 열이 말할 수 있습니다

2014-03-03 100 Good 
2014-03-03 15 Bad 
2014-03-04 120 Good 
2014-03-04 10 Bad 

내가 선택하고 좋은 - 나쁜 빼기하려면 : 그것은 가능

2014-03-03 85 
2014-03-04 110 

인가? 나는 많은 생각을하고 아직 아이디어가 없습니다. 그것은 내가 별개의 테이블에 좋고 나쁜 값을 가졌다면 다소 간단 할 것입니다.

+0

정확히 2 줄이 있습니까, 1. Good & 2. Bad, 각 날짜마다? –

답변

1

트릭은 아래 그림과 같이 자신의 테이블에 다시 가입하는 것입니다. myTable as AGood 행만 읽고 myTable as B 행은 Bad 행만 읽습니다. 그런 다음 행은 date을 기반으로 signle 행에 가입됩니다.

SQL Fiddle Demo

select 
a.date 
,a.count as Good_count 
,b.count as bad_count 
,a.count-b.count as diff_count 
from myTable as a 
inner join myTable as b 
on a.date = b.date and b.type = 'Bad' 
where a.type = 'Good' 

출력 반환

DATE       GOOD_COUNT BAD_COUNT DIFF_COUNT 
March, 03 2014 00:00:00+0000 100   15   85 
March, 04 2014 00:00:00+0000 120   10   110 

또 다른 aproach 대신 inner joinGroup by을 사용하는 것입니다 :

select 
a.date 
,sum(case when type = 'Good' then a.count else 0 end) as Good_count 
,sum(case when type = 'Bad' then a.count else 0 end) as Bad_count 
,sum(case when type = 'Good' then a.count else 0 end) - 
    sum(case when type = 'Bad' then a.count else 0 end) as Diff_count 
from myTable as a 
group by a.date 
order by a.date 

두 가지 접근법이 동일한 결과를 생성합니다.

+0

참고 : 첫 번째 해결책은 * '*'* '*' '*' '나쁜'관찰이있는 날 동안 실패합니다. – joop

+0

마침내 답을 테스트했습니다. 1 개의 접근법이 실패하는 상황은 제 경우에는 발생하지 않아야하며 두 번째 접근법을 부여하기 전에 그것을 사용했습니다 :) 그것은 작동하는 방법을 정확하게 설명합니다. 고마워요 :) –