SQL 고득점 Kit - 9.9

김동현·2024년 9월 11일

SQL 고득점 Kit

목록 보기
51/56

GROUP BY - 년, 월, 성별 별 상품 구매 회원 수 구하기

문제

USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.

https://school.programmers.co.kr/learn/courses/30/lessons/131532

1차 풀이

SELECT 
    YEAR(SALES_DATE) YEAR, 
    MONTH(SALES_DATE) MONTH, 
    GENDER, 
    COUNT(*) USERS
FROM 
    USER_INFO ui
INNER JOIN 
    ONLINE_SALE os
ON 
    ui.USER_ID = os.USER_ID
WHERE 
    GENDER IS NOT NULL    -- 성별 정보 없는 경우 제외
GROUP BY 
    YEAR(SALES_DATE), MONTH(SALES_DATE), GENDER    -- 문제에서 요구한 년, 월, 성별을 그룹화
ORDER BY 
    YEAR(SALES_DATE), MONTH(SALES_DATE), GENDER

2차 풀이

SELECT 
    YEAR(SALES_DATE) YEAR, 
    MONTH(SALES_DATE) MONTH, 
    GENDER, 
    COUNT(DISTINCT os.USER_ID) USERS    -- ID가 중복인 값이 존재한다. 대신 동일한 날짜는 아니라서 카운트가 된다.
FROM 
    USER_INFO ui
INNER JOIN 
    ONLINE_SALE os
ON 
    ui.USER_ID = os.USER_ID
WHERE 
    GENDER IS NOT NULL    -- 성별 정보 없는 경우 제외
GROUP BY 
    -- 문제에서 요구한 년, 월, 성별 그룹화
    YEAR(SALES_DATE), MONTH(SALES_DATE), GENDER
ORDER BY 
    YEAR(SALES_DATE), MONTH(SALES_DATE), GENDER

리뷰

  • 틀린 이유는 1차 풀이 때 USER_ID가 중복되는 것까지 계산을 했다.
  • 유저 각각을 개별로 카운트를 해야 하지만 문제에서 요구한 년, 월, 성별로만 구분하기 때문에 중복을 제외하지 않는다면 다른 유저로 판단하고 더 많은 카운트를 하게 된다.
  • 이것을 알게 된 이유는 출력문을 보고 년, 월, 성별에 아이디를 직접 카운트를 한 뒤 나의 쿼리와 비교하여 알게 되었다.
  • 출력문을 보고 문제를 생각하는 것도 중요하다는 것을 느꼈음

GitHub

년, 월, 성별 별 상품 구매 회원 수 구하기
https://github.com/lasentia/SQL_Study/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/4/131532.%E2%80%85%EB%85%84%EF%BC%8C%E2%80%85%EC%9B%94%EF%BC%8C%E2%80%85%EC%84%B1%EB%B3%84%E2%80%85%EB%B3%84%E2%80%85%EC%83%81%ED%92%88%E2%80%85%EA%B5%AC%EB%A7%A4%E2%80%85%ED%9A%8C%EC%9B%90%E2%80%85%EC%88%98%E2%80%85%EA%B5%AC%ED%95%98%EA%B8%B0

profile
'The best way to get started is to quit talking and begin doing.'

0개의 댓글