λ¬Έμ
π MySQL λ‘ νμ΄
π λ¬Έμ λ§ν¬ :
νλ‘κ·Έλλ¨Έμ€
μ½λ μ€μ¬μ κ°λ°μ μ±μ©. μ€ν κΈ°λ°μ ν¬μ§μ 맀μΉ. νλ‘κ·Έλλ¨Έμ€μ κ°λ°μ λ§μΆ€ν νλ‘νμ λ±λ‘νκ³ , λμ κΈ°μ κΆν©μ΄ μ λ§λ κΈ°μ λ€μ λ§€μΉ λ°μΌμΈμ.
programmers.co.kr
π λ¬Έμ μ€λͺ :
USER_INFO ν μ΄λΈκ³Ό ONLINE_SALE ν μ΄λΈμμ 2021λ μ κ°μ ν μ 체 νμλ€ μ€ μνμ ꡬ맀ν νμμμ μνμ ꡬ맀ν νμμ λΉμ¨(=2021λ μ κ°μ ν νμ μ€ μνμ ꡬ맀ν νμμ / 2021λ μ κ°μ ν μ 체 νμ μ)μ λ , μ λ³λ‘ μΆλ ₯νλ 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 μ‘°ν©μ λν΄μλ νλμ ν맀 λ°μ΄ν°λ§ μ‘΄μ¬ν©λλ€.
νμ΄
μΆμΈ‘)
2021λ μ κ°μ ν μ¬λμλ₯Ό λ³μλ‘ λ¨Όμ λμ .
κ·Έλ¦¬κ³ 2021λ μ κ°μ ν μ¬λλ€ λ¦¬μ€νΈλ₯Ό λμμΌλ‘ μ¨λΌμΈ μ£Όλ¬Έμ joinν΄μ μΌμΉνλ κ²μ μ‘°ν.
λ , μ κΈ°μ€μΌλ‘ κ·Έλ£Ήνν λ€μμ κ°μ λ¬μ λκ°μ μ¬λμ΄ μ£Όλ¬Ένμ κ²½μ°λ₯Ό μκ°ν΄μ μ€λ³΅μ κ±°λ‘ DISTINCT μ μ©νκ³
countλ‘ μ£Όλ¬Ένμμ, 2021κ°μ μ μ λ³μμμ count λΉμ¨μ κ΅¬ν΄ μΆλ ₯νλ©΄ λ λ―!
쿼리)
* 1μ°¨) μ€ν¨
SET @CNT = (SELECT COUNT(*) FROM USER_INFO WHERE YEAR(JOINED) = '2021');
SELECT DISTINCT
YEAR(O.SALES_DATE) AS YEAR,
MONTH(O.SALES_DATE) AS MONTH,
COUNT(*) AS PUCHASED_USERS,
ROUND(COUNT(*) / @CNT, 1) AS PUCHASED_RATIO
FROM ONLINE_SALE AS O
INNER JOIN (SELECT *
FROM USER_INFO
WHERE YEAR(JOINED) = '2021') AS U
ON O.USER_ID = U.USER_ID
GROUP BY YEAR, MONTH
ORDER BY YEAR ASC, MONTH ASC
* 2μ°¨) μ±κ³΅
SET @CNT = (SELECT COUNT(*) FROM USER_INFO WHERE YEAR(JOINED) = '2021');
SELECT
YEAR,
MONTH,
COUNT(*) AS PUCHASED_USERS,
ROUND(COUNT(*)/@CNT, 1) AS PUCHASED_RATIO
FROM (SELECT DISTINCT
YEAR(SALES_DATE) AS YEAR,
MONTH(SALES_DATE) AS MONTH,
USER_ID
FROM ONLINE_SALE) AS O # λ
,λ¬λ§λ€ ꡬ맀ν νμ 리μ€νΈ
INNER JOIN (SELECT USER_ID
FROM USER_INFO
WHERE YEAR(JOINED) = '2021') AS U # 2021λ
μ κ°μ
ν νμ 리μ€νΈ
ON O.USER_ID = U.USER_ID
GROUP BY YEAR, MONTH
ORDER BY YEAR ASC, MONTH ASC
리뷰)
1μ°¨μμ μ€λ³΅μ κ±°λ κ·Έλ£Ήνλ₯Ό κ°μ΄νλ©΄μ μλμΉ μμ κ²°κ³Όκ° λμλ€.
DISTINCTκ° μ€νλλ κΈ°μ€μ μκ°ν΄λ³΄λ©΄
1μ°¨μμλ μ€λ³΅μ΄ μ κ±°λμ§ μμ μνλ‘ λ¨Όμ countκ³Ό λΉμ¨μ΄ λ€ κ³μ°λκ³ λ μ΄νμ μ€λ³΅μ μ κ±°νλ κ±°λΌ,
κ°μ λ¬μ λ ꡬ맀ν ꡬ맀μλ₯Ό κ±°λ₯΄μ§ λͺ»νλ€.
μ΄ μ€λ³΅μ λ¨Όμ μ κ±°νκΈ° μν΄
2μ°¨μμλ λ κ³Ό λ¬ κΈ°μ€μΌλ‘ ꡬ맀ν νμμ μ€λ³΅μμ΄ λ¦¬μ€νΈν μν¬ μ μκ² μ§μν΄μ λ¨Όμ μ 리νκ³
μ΄λ₯Ό κΈ°μ€μΌλ‘ countν΄μ μ νν κ²°κ³Όκ° λμ€κ² νλ€!