[νλ‘κ·Έλλ¨Έμ€] μνμ ꡬ맀ν νμ λΉμ¨ ꡬνκΈ° (23.06.13 νμ΄ μΆκ°)
π’ λ³Έ ν¬μ€ν μ νμ©λλ κΈ°λ³Έ λ¬Έμ λ° μλ£ μΆμ²λ
νλ‘κ·Έλλ¨Έμ€ μ½λ©ν
μ€νΈ μ°μ΅,
https://school.programmers.co.kr/learn/challenges?page=1&languages=mysql%2Coracleμμ λ°νλλ€.
β λ¬Έμ
λ¬Έμ μ€λͺ
λ€μμ μ΄λ μλ₯ μΌνλͺ°μ κ°μ ν νμ μ 보λ₯Ό λ΄μ USER_INFO ν μ΄λΈκ³Ό μ¨λΌμΈ μν ν맀 μ 보λ₯Ό λ΄μ ONLINE_ SALE ν μ΄λΈ μ λλ€.
USER_INFO ν μ΄λΈμ μλμ κ°μ κ΅¬μ‘°λ‘ λμ΄μλ©° USER_ID, GENDER, AGE, JOINEDλ κ°κ° νμ ID, μ±λ³, λμ΄, κ°μ μΌμ λνλ λλ€.
Column name | Type | Nullable |
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, ν맀λ, ν맀μΌμ λνλ λλ€.
Column name | Type | Nullable |
ONLINE_SALE_ID | INTEGER | FALSE |
USER_ID | INTEGER | FALSE |
PRODUCT_ID | INTEGER | FALSE |
SALES_AMOUNT | INTEGER | FALSE |
SALES_DATE | DATE | FALSE |
λμΌν λ μ§, νμ ID, μν ID μ‘°ν©μ λν΄μλ νλμ ν맀 λ°μ΄ν°λ§ μ‘΄μ¬ν©λλ€.
λ¬Έμ
USER_INFO ν μ΄λΈκ³Ό ONLINE_SALE ν μ΄λΈμμ 2021λ μ κ°μ ν μ 체 νμλ€ μ€ μνμ ꡬ맀ν νμμμ μνμ ꡬ맀ν νμμ λΉμ¨(=2021λ μ κ°μ ν νμ μ€ μνμ ꡬ맀ν νμμ / 2021λ μ κ°μ ν μ 체 νμ μ)μ λ , μ λ³λ‘ μΆλ ₯νλ SQLλ¬Έμ μμ±ν΄μ£ΌμΈμ. μνμ ꡬ맀ν νμμ λΉμ¨μ μμμ λλ²μ§Έμ리μμ λ°μ¬λ¦Όνκ³ , μ 체 κ²°κ³Όλ λ μ κΈ°μ€μΌλ‘ μ€λ¦μ°¨μ μ λ ¬ν΄μ£Όμκ³ λ μ΄ κ°λ€λ©΄ μμ κΈ°μ€μΌλ‘ μ€λ¦μ°¨μ μ λ ¬ν΄μ£ΌμΈμ.
β νμ΄
λ¬Έμ μꡬμ¬ν
USER_INFO ν μ΄λΈκ³Ό ONLINE_SALE ν μ΄λΈμμ
2021λ μ κ°μ ν μ 체 νμλ€ μ€ μνμ ꡬ맀ν νμμμ μνμ ꡬ맀ν νμμ λΉμ¨
(=2021λ μ κ°μ ν νμ μ€ μνμ ꡬ맀ν νμμ / 2021λ μ κ°μ ν μ 체 νμ μ)μ λ , μ λ³λ‘ μΆλ ₯
> λΉμ¨μ λΆλͺ¨, λΆμ λ°μ΄ν° μλμ λͺ¨λ '2021λ μ κ°μ ν' νμμ΄λΌλ μ‘°κ±΄μ΄ λΆμ¬λμλ€.
μ΄ μ‘°κ±΄μ μΏΌλ¦¬λ‘ μ νμ΄λ΄λ κ²μ΄ μ€μνλ€.
<λΆλͺ¨> λ (2021λ κ°μ μμ΄λ©΄μ) ONLINE_SALE ν μ΄λΈμμ 2021λ ꡬ맀 νμμ μλ₯Ό μΆμΆν΄μΌνκ³
<λΆμ> λ USER_INFO ν μ΄λΈμμ 2021λ κ°μ νμμ μλ₯Ό μΆμΆ.
> 쿼리 μ€ν μμλ₯Ό μκ°νμ λ, ONLINE_SALE ν μ΄λΈ λ°μ΄ν°μμ USER_INFOμμ 2021λ κ°μ νμλ§μ λμμΌλ‘ ν μ΄λΈ λ°μ΄ν°λ₯Ό ꡬνκΈ° μν΄ USER_INFO ν μ΄λΈμ JOINED λ μ§ κΈ°κ° μ‘°κ±΄ + INNER JOIN μ μ©
> WHEREμ μ κ°μ μκΈ° 쑰건μ μ΄μ μ νμλ λ¬Έμ μ²λΌ DATE_FORMAT() μλ BETWEEN ~ AND λ¬Έλ² μ¬μ©
> λΆλͺ¨μ USER_INFO ν μ΄λΈμ λμμΌλ‘ 2021λ κ°μ μ μλ§ λ½μμ£Όλ μλΈμΏΌλ¦¬λ₯Ό μ¬μ©ν κ²μ΄ νμ΄μ μ μΌ μμμ μ΄ λμλ κ² κ°λ€.
μνμ ꡬ맀ν νμμ λΉμ¨μ μμμ λλ²μ§Έμ리μμ λ°μ¬λ¦Ό > SELECTμ μμ ROUND() ν¨μ μ¬μ©
μ 체 κ²°κ³Όλ λ μ κΈ°μ€μΌλ‘ μ€λ¦μ°¨μ μ λ ¬ > μ λ ¬μ‘°κ±΄ 1
λ μ΄ κ°λ€λ©΄ μμ κΈ°μ€μΌλ‘ μ€λ¦μ°¨μ μ λ ¬ > μ λ ¬μ‘°κ±΄ 2
SELECT DATE_FORMAT(OS.SALES_DATE, '%Y') YEAR,
DATE_FORMAT(OS.SALES_DATE, '%m') MONTH,
COUNT(DISTINCT OS.USER_ID) PUCHASED_USERS
,ROUND(COUNT(DISTINCT OS.USER_ID) / (SELECT COUNT(DISTINCT USER_ID)
FROM USER_INFO
WHERE JOINED BETWEEN '2021-01-01 00:00:00'
AND '2021-12-31 23:59:59'), 1) PUCHASED_RATIO
FROM ONLINE_SALE OS
INNER JOIN (SELECT USER_ID, JOINED
FROM USER_INFO
WHERE JOINED BETWEEN '2021-01-01 00:00:00' AND '2021-12-31 23:59:59') UI
ON OS.USER_ID = UI.USER_ID
GROUP BY 1, 2
ORDER BY 1, 2
β μΆκ° : λ μ§ν¨μ νμ©ν΄μ μ½λ κ°λ¨ν νκΈ° (2023.06.13 νμ΄)
SELECT YEAR(OS.SALES_DATE) AS YEAR
,MONTH(OS.SALES_DATE) AS MONTH
,COUNT(DISTINCT OS.USER_ID) AS PUCHASED_USERS
,ROUND((COUNT(DISTINCT OS.USER_ID) / (SELECT COUNT(DISTINCT USER_ID)
FROM USER_INFO
WHERE YEAR(JOINED) = '2021')), 1) AS PUCHASED_RATIO
FROM ONLINE_SALE OS
JOIN USER_INFO UI
ON OS.USER_ID = UI.USER_ID AND YEAR(UI.JOINED) = '2021'
GROUP BY 1, 2
ORDER BY 1, 2;
μΆκ° νμ΄μμλ μ‘°μΈν ν μ΄λΈμ user_infoμμ κ°μ Έμ¬ λ κ°μ λ λ = 2021 쑰건μ κ±Έμ΄μ£Όλ λμ
μ‘°μΈ κ³Όμ μμ κ°μ λ λκ° 2021λ μΈ userμ user_idλ§ μ‘°μΈλλλ‘ ν΄λ΄€λ€.