SELECT YEAR(OS.SALES_DATE) YEAR, MONTH(OS.SALES_DATE) MONTH, UI.GENDER GENDER, COUNT(DISTINCT USER_ID) USERS
FROM USER_INFO UI JOIN ONLINE_SALE OS
USING(USER_ID)
WHERE UI.GENDER IS NOT NULL
GROUP BY YEAR(OS.SALES_DATE), MONTH(OS.SALES_DATE), UI.GENDER
ORDER BY YEAR, MONTH, GENDER ASC ;
GROUP BY 로 연도, 월, 성별을 나눈 뒤, 회원 수를 COUNT했다.
이때, 중요한 점은 DISTINCT 부분인 것 같다.
처음에는 DISTINCT 없이 COUNT만 해서 제출해서 오답이 나왔는데,
해당 예시 테이블에서 USER_ID가 1인 사용자가 1월에 두 번 이상 구매했다면 회원 수를 COUNT할 때 중복이 되므로 DISTINCT를 사용해야겠다는 생각이 들었고, 쿼리에서 COUNT 연산에 DISTINCT를 추가로 입력했더니 정답 처리가 되었다.
+) USING → ON , WHERE → HAVING
SELECT에서 COUNT 연산은 WHERE - GROUP BY - HAVING 이후 순서이므로, NOT NULL 조건은 HAVING에 걸어주어도 같은 결과가 나온다!
SELECT YEAR(OS.SALES_DATE) AS YEAR, MONTH(OS.SALES_DATE) AS MONTH, UI.GENDER, COUNT(DISTINCT UI.USER_ID) AS USERS
FROM USER_INFO UI
JOIN ONLINE_SALE OS ON UI.USER_ID = OS.USER_ID
GROUP BY YEAR, MONTH, GENDER
HAVING UI.GENDER IS NOT NULL
ORDER BY YEAR, MONTH, GENDER ASC;
'SQL' 카테고리의 다른 글
programmers : 5월 식품들의 총매출 조회하기 (0) | 2023.01.13 |
---|---|
programmers : 주문량이 많은 아이스크림들 조회하기 (0) | 2023.01.13 |
programmers : 조건에 맞는 도서와 저자 리스트 출력하기 (0) | 2023.01.12 |
ORACLE DUAL (0) | 2023.01.10 |
programmers : 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2022.12.22 |