SQL

[PostgreSQL || SQL] SELECT절에서 여러 개의 카운트 (다중 카운트)

닷츠 2024. 1. 6. 06:10
728x90
반응형

* velog에서 포스팅했던 글을 옮겨왔습니다.

인스타그램의 2개 테이블이 있다고 가정해보자.

하나는 인스타그램의 유저 정보(users)를
또 다른 하나는 각 유저가 생성한 포스트의 정보(posts)를 담고 있다.
dots 이 사람은 인스타그램 중독인 듯...

이해를 돕기 위해 users 테이블도 같이 준비했으나,
아래 예시부터는 2개 테이블 간 Join을 생략하고 posts 테이블만으로 설명하겠다.

 

Q1. 유저별로 스토리의 개수를 카운트 하세요

간단하다. 

스토리의 개수를 세려면 스토리 값이 contents 필드로 들어가 있는 posts 테이블에서 가져와야한다.

FROM
해당 posts 데이터베이스에서

WHERE
contents 값이 스토리라는 조건을 걸고

SELECT
그에 맞는 포스트만 count해서 컬럼으로 보여줘,하면 된다.

(추가로, group by 유저별로 묶어줘야 아래 나올 결과처럼 보여진다.)

SQL 쿼리문으로 작성하면,

select
	p_table.user_id
	count(id)
from
	posts as p_table
where
	p_table.contents = '스토리'
group by
	p_table.user_id

조회 결과는,

 


 

Q2. 유저별로 스토리와 게시물의 개수를 한 번에 카운트 하세요

이번엔 조회 결과부터 먼저 본다면,

작성한 SQL 구문으로 이렇게 나와야 하는 것이다.

FROM
posts 데이터베이스에서

SELECT
각각 조건이 다른 (하나는 contents가 스토리, 다른 하나는 contents가 게시물) 카운트 두 개 이상을 한 번에 보려면

어떻게 해야 할까?
내가 찾은 방법은 select절에서 CASE 구문을 사용하는 것이다.

SQL 쿼리문으로 작성하면,

select
	p_table.user_id,
	count(CASE WHEN p_table.contents = '게시물' THEN 1 END) as count_게시물,
	count(CASE WHEN p_table.contents = '스토리' THEN 1 END) as count_스토리
from
	posts as p_table
group by
	p_table.user_id

 

여기서 핵심인 CASE문을 스토리 기준으로 다시 들여다 보자.

2개의 CASE문 안에서 각각 조건을 넣기 때문에 쿼리문 전체에 적용되는 where절의 조건은 빠졌다.

  1. 콘텐츠가 스토리인 케이스일 때 1을 리턴해줘
  2. 그렇게 리턴한 1의 개수만 모두 집계(count)해봐

참고로, 리턴한 1개의 개수를 집계할 때는 (위에서 2단계)
1의 개수를 세거나 (1 1개, 1 2개, 1 3개...) 생기는 1을 모두 합하는 방식의 결과는 같기에 (1 + 1 + 1 ...)
count() 대신 sum() 함수를 사용해도 된다.


혹시나 더 나은 방법을 알고 계신 분이 있다면
댓글로 남겨주세요 :)

정말 초보 혹은 비전공자 분을 위해 덧붙이면,
쿼리문 상의 별칭 여부 및 네이밍은 자유입니다!

 

728x90
반응형