CUSTOMER(customer_id, active)와 ORDERS(order_id, customer_id, paid, ordered_at)가 있다.활성 고객(active='Y') 중 2026년에 미결제 주문(paid='N')이 한 건도 없는 고객의 customer_id를 중복 없이 조회하는 SQL을 작성하시오.
CUSTOMER(customer_id, active)
ORDERS(order_id, customer_id, paid, ordered_at)모범답안
SELECT c.customer_id FROM CUSTOMER c WHERE c.active = 'Y' AND NOT EXISTS ( SELECT 1 FROM ORDERS o WHERE o.customer_id = c.customer_id AND o.paid = 'N' AND o.ordered_at >= DATE '2026-01-01' AND o.ordered_at < DATE '2027-01-01' );
풀이와 판단 근거
활성 고객을 기준으로 두고 각 고객에 대응하는 2026년 미결제 주문의 존재 여부를 NOT EXISTS로 검사한다. 날짜를 반개구간인 2026-01-01 이상, 2027-01-01 미만으로 비교하면 시간 값이 포함된 열에서도 연말 마지막 순간을 안전하게 포함한다.
NOT EXISTS는 주문이 여러 건이어도 고객 한 행을 그대로 유지하므로 별도의 DISTINCT가 필요하지 않다.
자주 틀리는 지점
- 미결제 주문을 JOIN한 뒤 paid='N'을 조회해 반대 결과를 만듦
- NOT IN을 사용하면서 NULL 가능성을 고려하지 않음
- 2026-12-31 이하 비교로 시간 값 일부를 누락
자동 판정 방식
한글·영문 동의어와 문항별 필수 개념을 확인하며, 정답 단어가 부정되거나 반대 개념과 함께 쓰이면 자동 정답으로 확정하지 않습니다. 부분점수는 ITPASSLAB의 학습용 예상 점수입니다.