02/17 SQL ๋ฌธ์ œํ’€์ด - 1251. Average Selling Price (Leetcode) (๐ŸŒŸ๐ŸŒŸ)

Data Architect / Engineerยท2024๋…„ 2์›” 17์ผ
1

1์ผ_1SQL

๋ชฉ๋ก ๋ณด๊ธฐ
33/63
post-thumbnail

๋ฌธ์ œ

  • LeetCode SQL ๋ฌธ์ œ
  • 1251. Average Selling Price / Easy
  • ๋ฌธ์ œ ๋‚ด์šฉ : [๋งํฌ]


๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ Query

select p.product_id
     , coalesce(round((sum(u.units * p.price) / sum(units)), 2), 0) as average_price
from prices p 
    left join unitssold u on u.product_id = p.product_id
     					and (purchase_date between start_date and end_date)
group by p.product_id
  • ์ œํ’ˆ ๋ฐ ๊ธฐ๊ฐ„๋ณ„ ๊ฐ€๊ฒฉ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” prices ํ…Œ์ด๋ธ”๊ณผ ์‹ค์ œ ํŒ๋งค๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์ธ unitssold ํ…Œ์ด๋ธ”์„ LEFT JOIN ํ•ด์ค€๋‹ค.
    (์™œ LFET JOIN? : ํŒ๋งค๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ average_price๋„ ๊ตฌํ•ด์ค˜์•ผํ•จ.)

  • LEFT JOIN ์‹œ product_id์™€ purchase_date๊ฐ€ start_date , end_date ๊ธฐ๊ฐ„ ์‚ฌ์ด์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค๋ผ๋ฆฌ join ํ•ด์ค€๋‹ค.
    (์ด์ „ ๋ฌธ์ œ๋“ค์ฒ˜๋Ÿผ ๋‹จ์ˆœํžˆ ์ œํ’ˆ๋ณ„ id๋งŒ ๊ณ ๋ คํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.)

  • ์ œํ’ˆ๋ณ„ ์ •๋ณด๋ฅผ ๊ตฌํ•ด์•ผํ•˜๋ฏ€๋กœ, product_id ๋ณ„๋กœ GROUP BY ํ•ด ์ค€๋‹ค.

  • SUM(units*price) / SUM(units) ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ average_price๋ฅผ ๊ณ„์‚ฐํ•ด์ค€๋‹ค.
    ROUND() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ํ‰๊ท  ๊ฐ€๊ฒฉ์„ ์†Œ์ˆ˜ 2๋ฒˆ์งธ์งœ๋ฆฌ ๊นŒ์ง€ ๋ฐ˜์˜ฌ๋ฆผํ•ด์ค€๋‹ค.
    ์ดํ›„ ํŒ๋งค๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ์ œํ’ˆ์˜ ํ‰๊ท ๊ฐ’๋„ ์ถœ๋ ฅํ•ด์ค˜์•ผ ํ•˜๋‹ˆ,COALESCE()ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ํŒ๋งค ๋ฐ์ดํ„ฐ ์—†๋Š” ๊ฒฝ์šฐ '0'์„ ์ถœ๋ ฅํ•˜๋„๋ก ํ•œ๋‹ค.

  • ๐ŸŒŸ๐ŸŒŸ ์ด ๋ฌธ์ œ ํŠน์ด์‚ฌํ•ญ
    1) JOIN ์‹œ ๋‹จ์ˆœํžˆ ์ปฌ๋Ÿผ๋ช…์ด ๊ฐ™์€ ์กฐ๊ฑด ์™ธ์—, ๊ตฌ๋งค๊ธฐ๊ฐ„ ๋ณ„ ๊ฐ€๊ฒฉ์ด ๋‹ค๋ฅด๋ฏ€๋กœ, purchase_date์— ๋Œ€ํ•œ ์กฐ๊ฑด๋„ ์žˆ์—ˆ์Œ.
    2) ํ•ญ์ƒ NULL ์กฐ์‹ฌํ•  ๊ฒƒ! ํŒ๋งค๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ์ œํ’ˆ๋„, ์ œํ’ˆ๋ณ„ ํ‰๊ท  ๊ฐ€๊ฒฉ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํŒ๋งค๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ์ œํ’ˆ์˜ ํ‰๊ท  ๊ฐ€๊ฒฉ์„ COALESEC()๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.!!!!

  • ํŠนํžˆ ์ง‘๊ณ„ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ NULL์€ ํ•ญ์ƒ ์ฃผ์˜ํ•  ๊ฒƒ!!

profile
์งˆ๋ฌธ์€ ๊ณ„์†๋ผ ์•„์˜ค์—

0๊ฐœ์˜ ๋Œ“๊ธ€