728x90
반응형

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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

 

 

 

 

VERSION 2.0

SELECT TO_CHAR(SALES_DATE , 'YYYY') AS YEAR , TO_NUMBER(TO_CHAR(SALES_DATE ,'MM')) AS MONTH ,
B.GENDER AS GENDER, COUNT(DISTINCT(A.USER_ID)) AS USERS
FROM ONLINE_SALE A
INNER JOIN USER_INFO B ON B.USER_ID = A.USER_ID
GROUP BY TO_CHAR(SALES_DATE , 'YYYY') , TO_NUMBER(TO_CHAR(SALES_DATE ,'MM')) , B.GENDER 
HAVING B.GENDER IS NOT NULL
ORDER BY YEAR , MONTH , GENDER

==> COUNT(DISTINCT) ==> 중복값 제거해줘야 한다.

 

 

VERSION 1.0

 

1. 

SELECT TO_CHAR(B.SALES_DATE , 'YYYY') AS YEAR , TO_NUMBER(TO_CHAR(B.SALES_DATE , 'MM')) AS MONTH ,
A.GENDER AS GENDER  AS USERS 
FROM ONLINE_SALE B 
INNER JOIN USER_INFO A  ON  B.USER_ID = A.USER_ID
ORDER BY YEAR ASC , MONTH ASC , A.GENDER ASC

A ==> USER_INFO 테이블

B ==> ONLINE_SALE 테이블 

 

INNER JOIN ==> ONLINE_SALE(B)에 있는 USER_ID와 USER_INFO(A)에 있는 USER_ID가 동일한거에 대해 JOIN

교집합을 추출하는 것이다.

 

 

 

2.

SELECT TO_CHAR(B.SALES_DATE , 'YYYY') AS YEAR , TO_NUMBER(TO_CHAR(B.SALES_DATE , 'MM')) AS MONTH ,
A.GENDER AS GENDER  AS USERS , B.PRODUCT_ID , A.AGE , A.USER_ID , B.USER_ID
FROM ONLINE_SALE B 
INNER JOIN USER_INFO A  ON  B.USER_ID = A.USER_ID
ORDER BY YEAR ASC , MONTH ASC , A.GENDER ASC

 

ONLINE_SALE 테이블(B) 과 USER_INFO(A) 테이블의 USER_ID가 동일한 데이터에 대해 교집합하여 데이터 추출 

==> age에 null값 ==> A테이블에 이미 비어있던것!

 

 

==> INNER JOIN을 통해 GROUP절 사용시 A와 B 상관없이 GROUP 사용가능하다.

 

3.

SELECT TO_CHAR(B.SALES_DATE , 'YYYY') AS YEAR , TO_NUMBER(TO_CHAR(B.SALES_DATE , 'MM')) AS MONTH ,
A.GENDER AS GENDER , COUNT(DISTINCT(A.USER_ID)) AS USERS 
FROM ONLINE_SALE B 
INNER JOIN USER_INFO A  ON  B.USER_ID = A.USER_ID
GROUP BY  TO_CHAR(B.SALES_DATE , 'YYYY') , TO_NUMBER(TO_CHAR(B.SALES_DATE , 'MM')) , A.GENDER
HAVING A.GENDER IS NOT NULL
ORDER BY YEAR ASC , MONTH ASC , A.GENDER ASC

==> GROUP BY ==> ONLINE_SALE(B) 테이블의 SALES_DATE 의 연도별 , ONLINE_SALE(B) 테이블의 월별 , 

USER_INFO(A) 테이블의 성별 데이터를 GROUP 화 

 

==> HAVING 절을 통해 USER_INFO(A)테이블의 성별데이터가 NULL값이 아닌것에 대해서만 출력하기

 

728x90
반응형

+ Recent posts