동일한 쿼리에서 다른 조건으로 Postgres Count


37

Postgres 9.3 편집

다음 스키마가있는 보고서를 작성 중입니다 .http : //sqlfiddle.com/#! 15 / fd104 / 2

현재 쿼리는 다음과 같이 정상적으로 작동합니다.

여기에 이미지 설명을 입력하십시오

기본적으로 3 테이블 내부 조인입니다. 나는이 쿼리를 만들지 않았지만 그것을 떠난 개발자는 쿼리를 수정하고 싶습니다. 보시다시피를 TotalApplication기준으로 총 애플리케이션 수를 계산합니다 a.agent_id. totalapplication결과 에서 열을 볼 수 있습니다. 내가 원하는 것은 그것을 제거 totalapplication하고 새로운 두 열로 변경하는 것입니다. completedsurveypartitalsurvey열 을 추가하고 싶습니다 . 기본적으로이 부분은

SELECT a.agent_id as agent_id, COUNT(a.id) as CompletedSurvey
FROM forms a WHERE  a.created_at >= '2015-08-01' AND 
a.created_at <= '2015-08-31' AND disposition = 'Completed Survey'
GROUP BY a.agent_id

방금 추가 AND disposition = 'Completed Survey'했지만 유일한 차이점은 partialsurvey동일한 쿼리가있는 다른 열이 필요합니다.completedsurvey

AND disposition = 'Partial Survey'

COUNT(a.id) as PartialSurvey

그러나 나는 그 쿼리를 어디에 둘 것인지 또는 어떻게 쿼리가 보일 것인지를 모른다.

agent_id, name, completedsurvey, partialsurvey, loginhours, applicationperhour, rph

괜찮 으면 applicationperhour 및 rph를 직접 해결할 수 있습니다.

답변:


74

내가 당신을 올바르게 이해하면 필터링 된 (조건부) 집계를 찾고 있습니다.

SELECT a.agent_id as agent_id, 
       COUNT(a.id) filter (where disposition = 'Completed Survey') as CompletedSurvey, 
       count(a.id) filter (where disposition = 'Partial Survey') as partial_survey
FROM forms a 
WHERE a.created_at >= '2015-08-01' 
  AND a.created_at <= '2015-08-31' 
GROUP BY a.agent_id;


이전 버전 (<9.4)에 대해 편집 하려면 case명령문 을 사용해야합니다 .

SELECT a.agent_id as agent_id, 
       COUNT(case when disposition = 'Completed Survey' then a.id end) as CompletedSurvey, 
       COUNT(case when disposition = 'Partial Survey' then a.id end) as partial_survey
FROM forms a 
WHERE a.created_at >= '2015-08-01' 
  AND a.created_at <= '2015-08-31' 
GROUP BY a.agent_id;

9.3을 사용하고 있습니다. 괜찮아?
jackhammer013

@JoeneFloresca : 아니오, 9.3의 경우 CASE진술 이 필요합니다 . 특히 현재 버전이 아닌 경우 항상 사용중인 버전을 지정해야합니다 .
a_horse_with_no_name

너무 감사합니다! 지금 완벽하게 작동합니다. 미안하지만 내 게시물을 편집하고 다음에 기억할 것입니다. 감사합니다 :)
jackhammer013


나에게 유용 (/)
Sajeev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.