SQL/문제

SQL | QCC 6회차

jjangdoll 2025. 3. 14. 20:43

1번

성별(GENDER) 기준

시험 점수가 높은 상위 3명의 학생 성별, 이름과 점수를 반환

두 학생이 동점일 경우, 나이가 많은 학생을 우선

결과는 성별(GENDER) 오름차순, 순위 오름차순으로 정렬

 

내가 쓴 답 : 

WITH a AS(
	SELECT
		GENDER,
		NAME,
		SCORE,
		DENSE_RANK () over (partition by gender order by score desc, age desc) as rnk
	FROM students)
SELECT GENDER, NAME, SCORE
FROM a
WHERE rnk <=3
ORDER BY GENDER, rnk ;

 

정답 : 

WITH student_ranks AS (
	SELECT *, RANK() OVER (PARTITION BY gender ORDER BY score DESC, age DESC) student_rank 
	FROM students 
)
SELECT GENDER, NAME, SCORE
FROM student_ranks
WHERE student_rank <= 3
ORDER BY gender, student_rank;

2번

도서 제목(TITLE)과 다음 정보를 반환하는 SQL 쿼리를 작성하세요 :

  • 미결제 금액 (DUE): 아직 결제되지 않은 총 금액
    • 계산 기준 : PAID_DATE 가 NULL인 주문 항목의 총 금액 합계
    • 결과는 반올림하여 정수로 반환
  • 결제 완료 금액 (PAID): 결제 완료된 총 금액
    • 계산 기준 : PAID_DATE 가 NULL이 아닌 주문 항목의 총 금액 합계
    • 결과는 반올림하여 정수로 반환

결과는 도서 제목(TITLE)을 기준으로 오름차순 정렬

 

내가 시도한 답 : 

WITH a AS
	(SELECT 
		b.TITLE,
		bo.PAID_DATE ,
		boi.QUANTITY , boi.line_total
	FROM books b 
		LEFT JOIN book_order_items boi ON b.ID = boi.BOOK_ID
		LEFT JOIN book_orders bo ON bo.ID = boi.ORDER_ID)
SELECT 
	TITLE,
	ROUND(CASE WHEN PAID_DATE IS NULL THEN SUM(line_total)
		 ELSE 0 END) AS DUE,
	ROUND(CASE WHEN PAID_DATE IS NOT NULL THEN SUM(line_total)
		 ELSE 0 END) AS PAID
FROM a
GROUP BY 1
ORDER BY 1 ;

📍 애초에 빈칸이라 최종에 null 값이 뜨는걸 해결 못함

 

정답 : 

SELECT 
    b.TITLE,
    ROUND(COALESCE(SUM((o.PAID_DATE IS NULL) * oi.LINE_TOTAL), 0), 0) AS DUE,
    ROUND(COALESCE(SUM((o.PAID_DATE IS NOT NULL) * oi.LINE_TOTAL), 0), 0) AS PAID
FROM books b
LEFT JOIN book_order_items oi ON b.ID = oi.BOOK_ID
LEFT JOIN book_orders o ON oi.ORDER_ID = o.ID
GROUP BY b.ID, b.TITLE
ORDER BY b.TITLE ASC;

3번

고객의 첫 주문 월을 기준 Cohort 그룹 생성

각 Cohort 그룹에서 시간이 지남에 따라 활성 사용자 수를 계산.

USER_COUNT_1_MONTH_LATER ~ USER_COUNT_12_MONTH_LATER 까지 계산

  • 각 Cohort 그룹에 대해 1개월 후부터 12개월 후까지의 활성 사용자 수를 추적

내가 시도한 답 : 

WITH a AS(
	SELECT 
		DATE_FORMAT(ORDER_DATE,'%Y-%m')  AS FIRST_ORDER_MONTH,
		ROW_NUMBER() OVER (PARTITION BY CUSTOMER_ID ORDER BY ORDER_DATE) AS num
	FROM customer_orders co)
SELECT 
	FIRST_ORDER_MONTH,
	COUNT(num) AS COHORT_USER_COUNT
FROM a
where num = 1
GROUP BY 1
oRDER BY 1

📍 활성 사용자 수까지는 시간도 없고 머리도 안 돌아가서 첫 주문 월 만드려고 노력했지만 실패

 

정답 : 

WITH cohort AS (
    SELECT
        CUSTOMER_ID,
        DATE(DATE_FORMAT(MIN(ORDER_DATE), '%Y-%m-01')) AS first_order_month
    FROM customer_orders
    GROUP BY CUSTOMER_ID
), active_orders AS (
    SELECT
        o.CUSTOMER_ID,
        c.first_order_month,
        DATE(DATE_FORMAT(o.ORDER_DATE, '%Y-%m-01')) AS active_month
    FROM customer_orders o
    JOIN cohort c
        ON o.CUSTOMER_ID = c.CUSTOMER_ID
), cohort_counts AS (
    SELECT
        first_order_month,
        active_month,
        COUNT(DISTINCT CUSTOMER_ID) AS user_count
    FROM active_orders
    GROUP BY first_order_month, active_month
)
SELECT
    DATE_FORMAT(first_order_month, '%Y-%m') FIRST_ORDER_MONTH,
    COALESCE(SUM(CASE WHEN active_month = first_order_month THEN user_count ELSE 0 END), 0) AS COHORT_USER_COUNT,
    COALESCE(SUM(CASE WHEN active_month = DATE_ADD(first_order_month, INTERVAL 1 MONTH) THEN user_count ELSE 0 END), 0) AS USER_COUNT_1_MONTH_LATER,
    COALESCE(SUM(CASE WHEN active_month = DATE_ADD(first_order_month, INTERVAL 2 MONTH) THEN user_count ELSE 0 END), 0) AS USER_COUNT_2_MONTH_LATER, 
    COALESCE(SUM(CASE WHEN active_month = DATE_ADD(first_order_month, INTERVAL 3 MONTH) THEN user_count ELSE 0 END), 0) AS USER_COUNT_3_MONTH_LATER,
    COALESCE(SUM(CASE WHEN active_month = DATE_ADD(first_order_month, INTERVAL 4 MONTH) THEN user_count ELSE 0 END), 0) AS USER_COUNT_4_MONTH_LATER,
    COALESCE(SUM(CASE WHEN active_month = DATE_ADD(first_order_month, INTERVAL 5 MONTH) THEN user_count ELSE 0 END), 0) AS USER_COUNT_5_MONTH_LATER,
    COALESCE(SUM(CASE WHEN active_month = DATE_ADD(first_order_month, INTERVAL 6 MONTH) THEN user_count ELSE 0 END), 0) AS USER_COUNT_6_MONTH_LATER,
    COALESCE(SUM(CASE WHEN active_month = DATE_ADD(first_order_month, INTERVAL 7 MONTH) THEN user_count ELSE 0 END), 0) AS USER_COUNT_7_MONTH_LATER,
    COALESCE(SUM(CASE WHEN active_month = DATE_ADD(first_order_month, INTERVAL 8 MONTH) THEN user_count ELSE 0 END), 0) AS USER_COUNT_8_MONTH_LATER,
    COALESCE(SUM(CASE WHEN active_month = DATE_ADD(first_order_month, INTERVAL 9 MONTH) THEN user_count ELSE 0 END), 0) AS USER_COUNT_9_MONTH_LATER,
    COALESCE(SUM(CASE WHEN active_month = DATE_ADD(first_order_month, INTERVAL 10 MONTH) THEN user_count ELSE 0 END), 0) AS USER_COUNT_10_MONTH_LATER,
    COALESCE(SUM(CASE WHEN active_month = DATE_ADD(first_order_month, INTERVAL 11 MONTH) THEN user_count ELSE 0 END), 0) AS USER_COUNT_11_MONTH_LATER,
    COALESCE(SUM(CASE WHEN active_month = DATE_ADD(first_order_month, INTERVAL 12 MONTH) THEN user_count ELSE 0 END), 0) AS USER_COUNT_12_MONTH_LATER
FROM cohort_counts
GROUP BY first_order_month
ORDER BY first_order_month;

 

'SQL > 문제' 카테고리의 다른 글

SQL | Challenges (중복값 조건에 맞춰서 제거)  (4) 2025.08.22
SQL | OCCUPATIONS (결과물 수직으로 출력)  (0) 2025.08.22
SQL | QCC 5회차  (0) 2025.02.28
SQL | QCC 4회차  (0) 2025.01.21
SQL | Binary Tree Nodes, New Companies  (0) 2025.01.17