๐Ÿงฉ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด(SQL)

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค_์ƒํ’ˆ ๋ณ„ ์˜คํ”„๋ผ์ธ ๋งค์ถœ ๊ตฌํ•˜๊ธฐ

carrot0911 2024. 11. 20. 15:38

๋ฌธ์ œ ์„ค๋ช…

https://school.programmers.co.kr/learn/courses/30/lessons/131533

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

๋‹ค์Œ์€ ์–ด๋Š ์˜๋ฅ˜ ์‡ผํ•‘๋ชฐ์—์„œ ํŒ๋งค์ค‘์ธ ์ƒํ’ˆ๋“ค์˜ ์ƒํ’ˆ ์ •๋ณด๋ฅผ ๋‹ด์€ PRODUCT ํ…Œ์ด๋ธ”๊ณผ ์˜คํ”„๋ผ์ธ ์ƒํ’ˆ ํŒ๋งค ์ •๋ณด๋ฅผ ๋‹ด์€ OFFLINE_SALE ํ…Œ์ด๋ธ” ์ž…๋‹ˆ๋‹ค. PRODUCT ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ PRODUCT_IDPRODUCT_CODEPRICE๋Š” ๊ฐ๊ฐ ์ƒํ’ˆ ID, ์ƒํ’ˆ์ฝ”๋“œ, ํŒ๋งค๊ฐ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Column name Type Nullable
PRODUCT_ID INTEGER FALSE
PRODUCT_CODE VARCHAR(8) FALSE
PRICE INTEGER FALSE

์ƒํ’ˆ ๋ณ„๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” 8์ž๋ฆฌ ์ƒํ’ˆ์ฝ”๋“œ ๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ, ์•ž 2์ž๋ฆฌ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
OFFLINE_SALE ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ OFFLINE_SALE_IDPRODUCT_IDSALES_AMOUNT, SALES_DATE๋Š” ๊ฐ๊ฐ ์˜คํ”„๋ผ์ธ ์ƒํ’ˆ ํŒ๋งค ID, ์ƒํ’ˆ ID, ํŒ๋งค๋Ÿ‰, ํŒ๋งค์ผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Column name Type Nullable
OFFLINE_SALE_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

๋™์ผํ•œ ๋‚ ์งœ, ์ƒํ’ˆ ID ์กฐํ•ฉ์— ๋Œ€ํ•ด์„œ๋Š” ํ•˜๋‚˜์˜ ํŒ๋งค ๋ฐ์ดํ„ฐ๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ

PRODUCT ํ…Œ์ด๋ธ”๊ณผ OFFLINE_SALE ํ…Œ์ด๋ธ”์—์„œ ์ƒํ’ˆ์ฝ”๋“œ ๋ณ„ ๋งค์ถœ์•ก(ํŒ๋งค๊ฐ€ * ํŒ๋งค๋Ÿ‰) ํ•ฉ๊ณ„๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ๊ฒฐ๊ณผ๋Š” ๋งค์ถœ์•ก์„ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์‹œ๊ณ  ๋งค์ถœ์•ก์ด ๊ฐ™๋‹ค๋ฉด ์ƒํ’ˆ์ฝ”๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

์˜ˆ์‹œ

์˜ˆ๋ฅผ ๋“ค์–ด PRODUCT ํ…Œ์ด๋ธ”์ด ๋‹ค์Œ๊ณผ ๊ฐ™๊ณ 

PRODUCT_ID PRODUCT_CODE PRICE
1 A1000011 15000
2 A1000045 8000
3 C3000002 42000

OFFLINE_SALE ํ…Œ์ด๋ธ”์ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋ฉด

OFFLINE_SALE_ID PRODUCT_ID SALES_AMOUNT SALES_DATE
1 1 2 2022-02-21
2 1 2 2022-03-02
3 3 3 2022-05-01
4 2 1 2022-05-24
5 1 2 2022-07-14
6 2 1 2022-09-22

๊ฐ ์ƒํ’ˆ ๋ณ„ ์ด ํŒ๋งค๋Ÿ‰๊ณผ ํŒ๋งค๊ฐ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • PRODUCT_CODE๊ฐ€ A1000011์ธ ์ƒํ’ˆ์€ ์ด ํŒ๋งค๋Ÿ‰์ด 6๊ฐœ, ํŒ๋งค๊ฐ€๊ฐ€ 15,000์›
  • PRODUCT_CODE๊ฐ€ A1000045 ์ธ ์ƒํ’ˆ์€ ์ด ํŒ๋งค๋Ÿ‰์ด 2๊ฐœ, ํŒ๋งค๊ฐ€๊ฐ€ 8,000์›
  • PRODUCT_CODE๊ฐ€ C3000002 ์ธ ์ƒํ’ˆ์€ ์ด ํŒ๋งค๋Ÿ‰์ด 3๊ฐœ, ํŒ๋งค๊ฐ€๊ฐ€ 42,000์›

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ฐ ์ƒํ’ˆ ๋ณ„ ๋งค์ถœ์•ก์„ ๊ณ„์‚ฐํ•˜๊ณ  ์ •๋ ฌํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

PRODUCT_CODE SALES
C3000002  126000
A1000011 90000
A1000045  16000

 

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

SELECT P.PRODUCT_CODE, SUM(P.PRICE * OS.SALES_AMOUNT) AS SALES
FROM PRODUCT P, OFFLINE_SALE OS
WHERE P.PRODUCT_ID = OS.PRODUCT_ID
GROUP BY P.PRODUCT_CODE
ORDER BY SALES DESC, P.PRODUCT_CODE;

์ฝ”๋“œ ์„ค๋ช…

  • SELECT P.PRODUCT_CODE, SUM(P.PRICE * OS.SALES_AMOUNT) AS SALES : PRODUCT ํ…Œ์ด๋ธ”์˜ PRODUCT_CODE ์ปฌ๋Ÿผ, PRODUCT ํ…Œ์ด๋ธ”์˜ PRICE ์ปฌ๋Ÿผ๊ณผ OFFLINE_SALE ํ…Œ์ด๋ธ”์˜ SALES_AMOUNT ์ปฌ๋Ÿผ์˜ ๊ณฑ์˜ ์ปฌ๋Ÿผ๋ช…์„ SALES๋ผ๊ณ  ์ง€์ •ํ•˜๊ณ  ์„ ํƒํ•œ๋‹ค.
  • FROM PRODUCT P, OFFLINE_SALE OS : PRODUCT ํ…Œ์ด๋ธ”์„ P, OFFLINE_SALES๋ฅผ OS๋กœ ์ง€์ •ํ•˜๊ณ  ๋‘ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰ ์กฐํ•ฉ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  • WHERE P.PRODUCT_ID = OS. PRODUCT_ID : PRODUCT ํ…Œ์ด๋ธ”์˜ PRODUCT_ID ์ปฌ๋Ÿผ๊ณผ OFFLINE_SALES ํ…Œ์ด๋ธ”์˜ PRODUCT_ID ์ปฌ๋Ÿผ์ด ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.
  • GROUP BY P.PRODUCT_CODE : PRODUCT ํ…Œ์ด๋ธ”์˜ PRODUCT_CODE ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•œ๋‹ค.
  • ORDER BY SALES DESC, P.PRODUCT_CODE : SALES ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ณ , ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ PRODUCT ํ…Œ์ด๋ธ”์˜ PRODUCT_CODE๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค.