상품을 구매한 회원비율 구하기 외 2건

ssook·2023년 1월 7일
0

SQL_Programmers_

목록 보기
3/5

상품을 구매한 회원비율 구하는 머시꺵이 문제는 제일 마지막에 잇읍니당


앞의 두 포스팅은 MYSQL이엇다면,
지금부턴 오라클로 풀려구 한당
금융권이다보니께 MYSQL보다 ORACLE을 더 많이 쓰는 거 같아서리 ㅎㅎ
근데 또 발령 난 동기 말 들어보면 거기선 또 MYSQL 쓴다구 그래서 걍 둘 다 겸사겸사 공부해두는 걸루다가...


1. 오프라인 / 온라인 판매 데이터 통합하기

SELECT TO_CHAR(SALES_DATE,'YYYY-MM-DD') AS SALES_DATE
       , PRODUCT_ID
       , USER_ID
       , SALES_AMOUNT

FROM
    (SELECT A.SALES_DATE
           , A.PRODUCT_ID
           , A.USER_ID
           , A.SALES_AMOUNT

    FROM ONLINE_SALE A

    UNION ALL

    SELECT B.SALES_DATE
           , B.PRODUCT_ID
           , NULL AS USER_ID
           , B.SALES_AMOUNT
    FROM   OFFLINE_SALE B) C
    
    WHERE  TO_CHAR(SALES_DATE,'YYYY-MM-DD') LIKE '2022-03%'
    
ORDER BY   SALES_DATE ASC, 
           PRODUCT_ID ASC,
           USER_ID ASC

저 인라인 뷰를 with문으로 묶어버려두 좋을 거 같지만 그냥 귀찮아서 냅둿다

2. 12세 이하인 여자 환자 목록 출력하기

SELECT  PT_NAME
        , PT_NO
        , GEND_CD
        , AGE
        , CASE 
            WHEN TLNO IS NULL THEN 'NONE'
            WHEN TLNO IS NOT NULL THEN TLNO
            END AS TLNO
FROM    PATIENT
WHERE   GEND_CD = 'W' AND AGE <= 12
ORDER BY AGE DESC, PT_NAME ASC

그냥 몸풀기겸...
DECODE보단 CASE문을 쓰자~~~
차장님두 현장에선 CASE에 비해 DECODE 쓰는 일이 많이 없다구 하셧당
솔직히 SM 입장에선 DECODE보단 CASE문이 보기 편한 것두 사실이긴 하니께...


3. 상품을 구매한 회원 비율 구하기

WITH JOIN_2021 AS (
    SELECT COUNT(DISTINCT F.USER_ID) AS JOIN
    FROM USER_INFO F
    WHERE TO_CHAR(JOINED,'YYYY-MM-DD') LIKE '2021-%'
),
PURCHASE_2021 AS (
    SELECT EXTRACT(YEAR FROM SALES_DATE) AS YEAR
           , EXTRACT(MONTH FROM SALES_DATE) AS MONTH
           , COUNT(DISTINCT N.USER_ID) AS PURCHASED_USERS
    FROM JOIN_2021
         , ONLINE_SALE N INNER JOIN USER_INFO F
           ON N.USER_ID = F.USER_ID 
           AND TO_CHAR(JOINED,'YYYY-MM-DD') LIKE '2021-%'
    GROUP BY EXTRACT(YEAR FROM SALES_DATE), EXTRACT(MONTH FROM SALES_DATE)
    ORDER BY YEAR ASC, MONTH ASC
)

SELECT YEAR
       , MONTH
       , PURCHASED_USERS
       , ROUND(PURCHASED_USERS / JOIN, 1) AS PURCHASED_RATIO
FROM PURCHASE_2021, JOIN_2021

다른 분들은 어케 풀었는지 모르지만
나는 인라인뷰 대신 WITH 절이랑 EXTRACT 써서 풀었다

JOIN_2021은 2021년에 가입한 사람들(분모로 쓰려고 따로 뽑음)이구
PURCHASE_2021은 2021년에 가입한 사람들 중 구매한 건을 뽑아서 고걸 이제 연, 월로 각각 정렬한 쿼리문이다. 요건 또 분자로 사용했다 ㅎ

좀 가독성 높이려고 WITH문 썼는디 더 나빠 보이는 거 같기두 하고,,,,?
아 글구 쿼리 성능 상 좌변 가공은 절대 하면 안 되어서 LIKE로 바꿔썻다

옛날에 짠 쿼리 중에 성능이고 나발이고 그렇게 짠 거 있는디
지금 와서 보면 돌았냐는 생각 밖에 안 든다ㅎ

고럼 오늘 일기 끗

profile
개발자에서, IT Business 담당자로. BrSE 업무를 수행하고 있습니다.

0개의 댓글