반응형
◆ FILTER 절이란?
PostgreSQL의 FILTER 절은 집계함수(aggregate function)에 조건을 적용하여 특정 조건에 맞는 데이터만 집계할 수 있도록 하는 기능이다.
◆ FILTER 절의 기본 사용법
FILTER절은 SQL 표준에 따라 PostgreSQL이 지원하는 문법으로, 집계함수 뒤에 FILTER 키워드를 사용하여 적용하며, 이 경우 반드시 WHERE 조건을 포함해야 한다.
MySQL, Oracle 등 다른 DBMS에서는 지원되지 않기 때문에, CASE문을 활용해 동일 기능을 구현해야 한다.
문법: 집계함수(...) FILTER (WHERE 조건)
-- 총 주문수와 완료된 주문수 집계
SELECT
COUNT(*) AS 총주문수
, COUNT(*) FILTER (WHERE order_status = 'completed') AS 완료된주문수
FROM orders;
◆ 예제
PostgreSQL FILTER 절의 집계함수와 동일한 처리를 다른 DBMS(MySQL, Oracle)에서 어떻게 구현하는지 비교한 예제이니 참고하자.
-- PostgreSQL FILTER WHERE
SELECT
category AS 카테고리
, COUNT(*) AS 전체상품수
, COUNT(*) FILTER (WHERE stock > 0) AS 재고있는상품수
, SUM(price) FILTER (WHERE stock > 0) AS 재고있는상품의총가격
, AVG(price) FILTER (WHERE stock > 0) AS 재고있는상품의평균가격
, MAX(price) FILTER (WHERE stock > 0) AS 재고있는상품의최고가격
, MIN(price) FILTER (WHERE stock > 0) AS 재고있는상품의최저가격
FROM products
GROUP BY category
ORDER BY 전체상품수 DESC;
-- MySQL, Oracle CASE문
SELECT
category AS 카테고리
, COUNT(*) AS 전체상품수
, SUM(CASE WHEN stock > 0 THEN 1 ELSE 0 END) AS 재고있는상품수
, SUM(CASE WHEN stock > 0 THEN price ELSE 0 END) AS 재고있는상품의총가격
, AVG(CASE WHEN stock > 0 THEN price END) AS 재고있는상품의평균가격
, MAX(CASE WHEN stock > 0 THEN price END) AS 재고있는상품의최고가격
, MIN(CASE WHEN stock > 0 THEN price END) AS 재고있는상품의최저가격
FROM products
GROUP BY category
ORDER BY 전체상품수 DESC;
참조
Aggregate Expressions
https://www.postgresql.org/docs/current/sql-expressions.html#SYNTAX-AGGREGATES
글 내용 중 잘못된 부분이 있거나, 첨부하실 내용이 있으시면 댓글로 남겨주세요. 공부하는데 많은 도움이 됩니다.
-- 기억의 유효기간은 생각보다 짧다. --
반응형
'데이터베이스 > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] 시퀀스 last value(현재 값) 변경 방법 - setval() (2) | 2025.08.13 |
---|---|
[PostgreSQL] 대소문자 구분 없이 문자열 치환 (REGEXP_REPLACE) (1) | 2025.07.04 |
[PostgreSQL] 인코딩(encoding) 확인하기 (1) | 2024.10.23 |
[PostgreSQL] 인덱스(Index) 정보를 조회하기(pg_indexes) (1) | 2024.07.28 |
[PostgreSQL] 남은 연결 슬롯은 non-replication 슈퍼유저 연결용으로 남겨 놓았음 (0) | 2024.04.28 |