Coding Test/SQL

Programmers] λ…„, μ›”, 성별 별 μƒν’ˆ ꡬ맀 νšŒμ› 수 κ΅¬ν•˜κΈ°

littlezero48 2023. 4. 8. 02:13

문제

πŸ“Œ MySQL 으둜 풀이

 

πŸ“Œ λ¬Έμ œ 링크 :

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr

 

πŸ“Œ λ¬Έμ œ μ„€λͺ… :

USER_INFO ν…Œμ΄λΈ”κ³Ό ONLINE_SALE ν…Œμ΄λΈ”μ—μ„œ λ…„, μ›”, 성별 λ³„λ‘œ μƒν’ˆμ„ κ΅¬λ§€ν•œ νšŒμ›μˆ˜λ₯Ό μ§‘κ³„ν•˜λŠ” SQL문을 μž‘μ„±ν•΄μ£Όμ„Έμš”. κ²°κ³ΌλŠ” λ…„, μ›”, 성별을 κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•΄μ£Όμ„Έμš”. μ΄λ•Œ, 성별 정보가 μ—†λŠ” 경우 κ²°κ³Όμ—μ„œ μ œμ™Έν•΄μ£Όμ„Έμš”.

 

πŸ“Œ ν…Œμ΄λΈ”

λ‹€μŒμ€ μ–΄λŠ 의λ₯˜ μ‡Όν•‘λͺ°μ— κ°€μž…ν•œ νšŒμ› 정보λ₯Ό 담은 USER_INFO ν…Œμ΄λΈ”κ³Ό 온라인 μƒν’ˆ 판맀 정보λ₯Ό 담은 ONLINE_SALE ν…Œμ΄λΈ” μž…λ‹ˆλ‹€.USER_INFO ν…Œμ΄λΈ”은 μ•„λž˜μ™€ 같은 ꡬ쑰둜 λ˜μ–΄μžˆμœΌλ©° USER_ID, GENDER, AGE, JOINEDλŠ” 각각 νšŒμ› ID, 성별, λ‚˜μ΄, κ°€μž…μΌμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

USER_ID INTEGER FALSE
GENDER TINYINT(1) TRUE
AGE INTEGER TRUE
JOINED DATE FALSE

GENDER μ»¬λŸΌμ€ λΉ„μ–΄μžˆκ±°λ‚˜ 0 λ˜λŠ” 1의 값을 κ°€μ§€λ©° 0인 경우 λ‚¨μžλ₯Ό, 1인 κ²½μš°λŠ” μ—¬μžλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

ONLINE_SALE ν…Œμ΄λΈ”은 μ•„λž˜μ™€ 같은 ꡬ쑰둜 λ˜μ–΄μžˆμœΌλ©°, ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATEλŠ” 각각 온라인 μƒν’ˆ 판맀 ID, νšŒμ› ID, μƒν’ˆ ID, νŒλ§€λŸ‰, νŒλ§€μΌμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

ONLINE_SALE_ID INTEGER FALSE
USER_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

λ™μΌν•œ λ‚ μ§œ, νšŒμ› ID, μƒν’ˆ ID 쑰합에 λŒ€ν•΄μ„œλŠ” ν•˜λ‚˜μ˜ 판맀 λ°μ΄ν„°λ§Œ μ‘΄μž¬ν•©λ‹ˆλ‹€.


풀이

μΆ”μΈ‘) 

λΆ„λ₯˜ν•˜κ³ μž ν•˜λŠ” 3개 컬럼과 νšŒμ› 아이디 λ§Œμ„ μ§ˆμ˜ν•˜λŠ” 쿼리 λ¨Όμ €ν•˜κ³  이λ₯Ό λΆ„λ₯˜ 컬럼으둜 Group byν•΄μ€˜μ„œ countν•˜λ©΄ λ λ“―ν•˜λ‹€. 

 

쿼리) 

* 1μ°¨) 성곡

SELECT A.YEAR, A.MONTH, A.GENDER, COUNT(A.USER_ID) AS USERS
FROM
    (SELECT 
        YEAR(SALES_DATE) AS YEAR, 
        MONTH(SALES_DATE) AS MONTH,
        GENDER,
        U.USER_ID
    FROM ONLINE_SALE AS O
    LEFT OUTER JOIN USER_INFO AS U
    ON O.USER_ID = U.USER_ID
    WHERE U.GENDER IS NOT NULL
    GROUP BY YEAR, MONTH, GENDER, U.USER_ID) AS A
GROUP BY A.YEAR, A.MONTH, A.GENDER
ORDER BY YEAR ASC, MONTH ASC, GENDER ASC

* 2μ°¨) 성곡

SELECT A.YEAR, A.MONTH, A.GENDER, COUNT(A.USER_ID) AS USERS
FROM
    (SELECT DISTINCT
        YEAR(SALES_DATE) AS YEAR, 
        MONTH(SALES_DATE) AS MONTH,
        GENDER,
        U.USER_ID
    FROM ONLINE_SALE AS O
    LEFT OUTER JOIN USER_INFO AS U
    ON O.USER_ID = U.USER_ID
    WHERE U.GENDER IS NOT NULL) AS A
GROUP BY A.YEAR, A.MONTH, A.GENDER
ORDER BY YEAR ASC, MONTH ASC, GENDER ASC

 

리뷰) 

+ 같은 λ‹¬μ˜ 쀑볡 ꡬ맀 νšŒμ›μ„ μ œμ™Έ ν•  ν•„μš”λ„ μžˆμ—ˆλ‹€

 

그리고 쒀더 효율적으둜 λ°”κΎΈκ³  μ‹Άμ–΄!

1μ°¨μ—μ„œμ˜ Group byλ₯Ό μ œμ™Έν•˜κ³  Distinct둜 쀑볡을 μ œκ±°ν•˜λŠ” λ°©μ‹μœΌλ‘œ 같은 달에 μ—¬λŸ¬λ²ˆ κ΅¬λ§€ν•œ νšŒμ›μˆ˜λ₯Ό μ œμ™Έν–ˆλ‹€.

μ΄λŸ¬λ‹ˆκΉŒ μ—¬λŸ¬λͺ¨λ‘œ κ³΅μˆ˜κ°€ 많이 λ“œλŠ” Group byλ₯Ό ν•˜λ‚˜ μ œμ™Έν•  수 μžˆμ—ˆμŒ!