Programing Language/SQL

3. ์œˆ๋„์šฐ ํ•จ์ˆ˜ ๋ฌธ์ œ

Data-SSung 2025. 6. 14. 23:35
๋ฐ˜์‘ํ˜•

๐ŸŸข ์—ฐ์Šต๋ฌธ์ œ 3-1: ๊ธฐ๋ณธ ์ˆœ์œ„

  • RANK() : ๋™์ผํ•œ ์ ์ˆ˜์— ๋Œ€ํ•ด์„œ ๊ฐ™์€ ์ˆœ์œ„ ๋งค๊น€
    => ์ƒํ’ˆ๋ณ„ ์ด ํŒ๋งค๋Ÿ‰ ์ˆœ์œ„์— ์ ์ ˆ
  • ROW_NUMBER() : ๋™์ผํ•œ ์ ์ˆ˜์—ฌ๋„ ํ•˜๋‚˜์˜ ์ˆœ์œ„๋งŒ ๋งค๊น€
    => ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด ๊ณ ๊ฐ๋ณ„ ์ˆœ์œ„์— ์ ์ ˆ 
[๋ฌธ์ œ]
์ƒํ’ˆ๋ณ„ ์ด ํŒ๋งค๋Ÿ‰์„ ๊ตฌํ•˜๊ณ , ํŒ๋งค๋Ÿ‰ ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ์‹œ์˜ค.

[ํ…Œ์ด๋ธ” ๊ตฌ์กฐ]
products: product_id, product_name, category
order_items: order_item_id, order_id, product_id, quantity

-- ๋‹ต
SELECT A.product_id, A.product_name
    , SUM(B.quantity) TOTAL_QUNAT
    , RANK() OVER(ORDER BY SUM(B.quantity) DESC) RN
FROM PRODUCTS A
INNER JOIN ORDER_ITEMS B
    ON A.PRODUCT_ID = B.PRODUCT_ID
GROUP BY A.product_id, A.product_name
ORDER BY RN DESC

 

์‹ค์ „๋ฌธ์ œ 3-1: ์›”๋ณ„ ๋งค์ถœ ์„ฑ์žฅ๋ฅ ๊ณผ ์ด๋™ํ‰๊ท 

  • GROUPBYํ•  ๋•Œ,  (YEAR, MONTH)๊ฐ€ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ๋˜์–ด DATE_FORMAT๋ณด๋‹ค๋Š” ์—ฐ์‚ฐ๋Ÿ‰์ด ์ ์–ด ํšจ์œจ์ ์ž„
  • ์ „์›” ๋Œ€๋น„ : LAGํ•จ์ˆ˜๋ฅผ ์จ์„œ ์ง์ „๋‹ฌ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ ORDER BY ๋Š” ์›”๋ณ„ ์˜ค๋ฆ„์ฐจ์ˆœ ์„ค์ •
  • 3๊ฐœ์›” ์ด๋™ ํ‰๊ท  : AVGํ•จ์ˆ˜ ์‚ฌ์šฉ ORDER BY ์›”๋ณ„ ์˜ค๋ฆ„์ฐจ์ˆœ ์„ค์ • ํ›„ 2๊ฐœ ์ง์ „๋‹ฌ ํ•ฉ๊ณ„ ๊ฐ€์ ธ์˜ค๊ธฐ
    • ์ง์ „๋‹ฌ ํ•ฉ๊ณ„ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ : ROWS 2 PRECEDING(์•ž์„  ์ด์ „์˜)
  • ์—ฐ์ดˆ ๋Œ€๋น„ ๋ˆ„์  ์ฆ๊ฐ๋ฅ  : ์ „์›” ๋Œ€๋น„ ์ฆ๊ฐ์œจ๊ณผ ๋ฐฉ์‹์€ ๋™์ผํ•˜๋‚˜, ์—ฐ์ดˆ ๊ฐ’์„ FIRST_VALUE ํ•จ์ˆ˜ ์‚ฌ์šฉ
[๋ฌธ์ œ]
2023๋…„ ์›”๋ณ„ ๋งค์ถœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋‹ค์Œ์„ ๊ตฌํ•˜์‹œ์˜ค:
1. ๊ฐ ์›”์˜ ์ด ๋งค์ถœ
2. ์ „์›” ๋Œ€๋น„ ์ฆ๊ฐ๋ฅ  (%) : ์ „์›” ๋Œ€๋น„ ์ฆ๊ฐ๋ฅ  = (ํ˜„์žฌ์›” ๋งค์ถœ - ์ „์›” ๋งค์ถœ) / ์ „์›” ๋งค์ถœ × 100
3. 3๊ฐœ์›” ์ด๋™ํ‰๊ท 
4. ์—ฐ์ดˆ ๋Œ€๋น„ ๋ˆ„์  ์ฆ๊ฐ๋ฅ 
๊ฒฐ๊ณผ๋Š” ์›” ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•˜์‹œ์˜ค.

[ํ…Œ์ด๋ธ” ๊ตฌ์กฐ]
orders: order_id, customer_id, order_date, amount, status

-- ๋‹ต
SELECT  YEAR(ORDER_DATE) ORDER_YEAR
	, MONTH(ORDER_DATE) ORDER_MONTH
    -- ๊ฐ ์›”์˜ ์ด ๋งค์ถœ
    , SUM(AMOUNT) SALE_SUM
    -- ์ „์›” ๋Œ€๋น„ ์ฆ๊ฐ๋ฅ 
    , ROUND(
    	(SUM(AMOUNT) - LAG(SUM(AMOUNT)) OVER(ORDER BY YEAR(ORDER_DATE), MONTH(ORDER_DATE)) )
        /LAG(SUM(AMOUNT)) OVER(ORDER BY YEAR(ORDER_DATE), MONTH(ORDER_DATE)) *100
    	,2) SALE_RATE
    -- 3๊ฐœ์›” ์ด๋™ํ‰๊ท 
    , ROUND(
    	AVG(SUM(AMOUNT))
        	OVER(ORDER BY YEAR(ORDER_DATE), MONTH(ORDER_DATE))
            ROWS 2 PRECEDING)
    	,2) THREE_SALE_AVG
	-- ์—ฐ์ดˆ ๋Œ€๋น„ ๋ˆ„์  ์ฆ๊ฐ๋ฅ 
    , ROUND(
    	(SUM(AMOUNT) - FIRST_VALUE(SUM(AMOUNT)) OVER(ORDER BY YEAR(ORDER_DATE), MONTH(ORDER_DATE)) )
        /FIRST_VALUE(SUM(AMOUNT)) OVER(ORDER BY YEAR(ORDER_DATE), MONTH(ORDER_DATE))*100
    	,2) SALE_RATE2
FROM ORDERS
WHERE ORDER_DATE >= '2023-01-01'
	AND ORDER_DATE < '2024-01-01'
    AND STATUS = 'COMPLETED'
GROUP BY YEAR(ORDER_DATE)
	, MONTH(ORDER_DATE)
ORDER BY ORDER_YEAR, ORDER_MONTH
;

 

 

๐ŸŽฏ ์ƒํ™ฉ๋ณ„ ์ตœ์  ์„ ํƒ

๐Ÿ“‹ ์ถœ๋ ฅ ํ˜•ํƒœ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ

 
sql
-- ์š”๊ตฌ์‚ฌํ•ญ: "2023-01", "2023-02" ํ˜•ํƒœ๋กœ ์ถœ๋ ฅ
DATE_FORMAT(ORDER_DATE, '%Y-%m') โœ…
-- vs
CONCAT(YEAR(ORDER_DATE), '-', LPAD(MONTH(ORDER_DATE), 2, '0')) โŒ (๋ณต์žกํ•จ)

๐Ÿš€ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ

 
sql
-- ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ + ์ธ๋ฑ์Šค ํ™œ์šฉ
YEAR(ORDER_DATE), MONTH(ORDER_DATE) โœ…
-- vs  
DATE_FORMAT(ORDER_DATE, '%Y-%m') โŒ (๋ฌธ์ž์—ด ์—ฐ์‚ฐ ๋ถ€ํ•˜)

๐Ÿ“Š ์„ฑ๋Šฅ ์ฐจ์ด ์ด์œ 

DATE_FORMAT์ด ๋А๋ฆฐ ์ด์œ :

  • ๋ฌธ์ž์—ด ๋ณ€ํ™˜ ์—ฐ์‚ฐ
  • ์ธ๋ฑ์Šค ํ™œ์šฉ๋„ ๋‚ฎ์Œ
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€

YEAR, MONTH๊ฐ€ ๋น ๋ฅธ ์ด์œ :

  • ์ •์ˆ˜ ์—ฐ์‚ฐ
  • ๋‚ ์งœ ์ธ๋ฑ์Šค ์ง์ ‘ ํ™œ์šฉ
  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ 

๐Ÿ’ก ์‹ค๋ฌด ๊ถŒ์žฅ์‚ฌํ•ญ

 
sql
-- ํ™”๋ฉด ์ถœ๋ ฅ์šฉ: DATE_FORMAT ์‚ฌ์šฉ
SELECT DATE_FORMAT(ORDER_DATE, '%Y-%m') AS SALES_MONTH

-- ์ง‘๊ณ„/๋ถ„์„์šฉ: YEAR, MONTH ์‚ฌ์šฉ  
GROUP BY YEAR(ORDER_DATE), MONTH(ORDER_DATE)

๊ฒฐ๋ก : ๋ฌธ์ œ์—์„œ ํŠน๋ณ„ํ•œ ์ถœ๋ ฅ ํ˜•ํƒœ๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š์œผ๋ฉด YEAR, MONTH๊ฐ€ ๋” ํšจ์œจ์ ์ด์—์š”!

๋ฐ˜์‘ํ˜•