녕녀기의 실험일지

[ Oracle ] 프로그래머스 코테 DISTINCT, COUNT, 상품을 구매한 회원 구하기 본문

-- Data --/- SQL -

[ Oracle ] 프로그래머스 코테 DISTINCT, COUNT, 상품을 구매한 회원 구하기

녕녀기 2023. 8. 11. 10:06

본문으로

안녕하세요. 녀기입니다.

 

SQL 연습을 하다가 DISTINCT에 대한 쓰임새?

 

를 기록하고자 포스팅합니다.

(

 

사실 이전에 했던 포스팅과 연관이 됩니다...ㅎㅎ

 

그 때 필기해 놨는데 고새 까먹고 응용을 못 하다니

 

반성하겠습니다.

 

벌로 SQL 연습 게을리 하지 않기(?)

 

😥

 

)

 

이전 포스팅은 이렇습니다!

 

참고용으로 올려 놓을게요.

 

https://nyeoki-log.tistory.com/35

 

[ Oracle ] COUNT() 함수를 이용한 집계

본문으로 안녕하세요. 녀기입니다. 굉장히 오랜만이군요. (롱 타임 노 씨?ㅋㅋㅋ) 요즘 출퇴근 시간이 약 4시간이 걸리는 바람에 너무 잠이 모자라고, 운동은 안 하면 체력 떨어지고 해서, 공부에

nyeoki-log.tistory.com

 

(ORACLE 기준으로 작성됐습니다.)


문제 출처는 아래 ↓

https://school.programmers.co.kr/learn/courses/30/lessons/131534#qna

 

프로그래머스

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

programmers.co.kr

 

WITH TWENTY_ONE AS (
SELECT *
FROM USER_INFO 
WHERE TO_CHAR(JOINED,'YYYY')='2021'
    )
    

SELECT EXTRACT(YEAR FROM OS.SALES_DATE) AS YEAR, 
        EXTRACT(MONTH FROM OS.SALES_DATE) AS MONTH, 
        COUNT(DISTINCT(TON.USER_ID)) AS PURCHASED_USERS,
        ROUND(
            COUNT(DISTINCT(TON.USER_ID))/(SELECT COUNT(USER_ID) FROM TWENTY_ONE),1) AS PURCHASED_RATIO
FROM TWENTY_ONE TON INNER JOIN ONLINE_SALE OS 
ON TON.USER_ID = OS.USER_ID
GROUP BY EXTRACT(YEAR FROM OS.SALES_DATE), 
        EXTRACT(MONTH FROM OS.SALES_DATE)
        
ORDER BY YEAR, MONTH;

위 문제는 2021년에 가입한 회원들 중에 상품을 구매한 회원의 비율을 연, 월 별로 나눠서 보겠다는 것이 목적입니다.

 

그래서 2021년에 가입한 회원만 따로 빼 놓았고

 

구매 기록이 있는 테이블과 INNER JOIN 후에,

 

구매 기록의 연, 월 별로 GROUPING을 실시했습니다.

 

 

 

처음에 계속 통과를 못 하고 있었는데,

 

DISTINCT를 사용하지 않아서 생기는 문제였습니다.

 

 

 

COUNT 집계 함수를 사용하면 해당 테이블에서

 

조건에 맞는 데이터를 전부 세어 줍니다.

 

근데 보통

 

한 유저가 한 번의 거래만 하고 끊나지는 않죠.

 

녀기의 USER_ID가 10이라고 하면,

 

USER_ID가 10인 데이터가 여러 개 있을 수 있다는 겁니다.

 

 

 

문제에서 원하는 바는

 

"거래를 했느냐?(거래 기록이 있느냐?)"

 

물어보는 것이기에 녀기는 여러 번 포함되면 안 됩니다.

 

다른 유저가 아니기 때문이죠!

 

중복된 기록을 제거하고 출력을 한 뒤 COUNT 해야하는 것이었습니다.


이는 굉장히 중요한 개념인 것 같습니다.

 

세어서는 안 될 데이터가 포함돼 

 

데이터 갯수가 불가피하게 많아진다면

 

큰 오류가 발생할 수도 있으니까요!!

 

 

 

분석하면서 신경써야 할 부분이기 때문에

 

다시 한 번 상기하고

 

실전에서 응용할 수 있도록 연습을 꾸준히 하겠습니다!!

Comments