์ŠคํŒŒ๋ฅดํƒ€ ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„(25.12.01~)

์ŠคํŒŒ๋ฅดํƒ€ ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„_๋ณธ์บ ํ”„_data11๊ธฐ ๊น€์„ ์˜_TIL_Day 20

0๏ธโƒฃ 2026. 1. 20. 23:09

[์˜ค๋Š˜์˜ ํ•™์Šต]

  • SQL ์ฝ”๋“œ์นดํƒ€ (์ค‘๊ธ‰ 4๊ฐœ)
  • Python ์ฝ”๋“œ์นดํƒ€ (์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์ž…๋ฌธ 5๊ฐœ)
  • ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ/์‹œ๊ฐํ™” ์„ธ์…˜ 3ํšŒ์ฐจ

[ํ•™์Šต๋‚ด์šฉ ์ •๋ฆฌ]

# SQL ์ฝ”๋“œ์นดํƒ€

โ˜‘๏ธ ์กฐ๊ฑด์— ๋งž๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒํ•˜๊ธฐ [๐Ÿ”—] ๐Ÿ”ด

`USED_GOODS_BOARD`์™€ `USED_GOODS_USER` ํ…Œ์ด๋ธ”์—์„œ ์ค‘๊ณ  ๊ฑฐ๋ž˜ ๊ฒŒ์‹œ๋ฌผ์„ 3๊ฑด ์ด์ƒ ๋“ฑ๋กํ•œ ์‚ฌ์šฉ์ž์˜ ์‚ฌ์šฉ์ž ID, ๋‹‰๋„ค์ž„, ์ „์ฒด์ฃผ์†Œ, ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
์ด๋•Œ, ์ „์ฒด ์ฃผ์†Œ๋Š” ์‹œ, ๋„๋กœ๋ช… ์ฃผ์†Œ, ์ƒ์„ธ ์ฃผ์†Œ๊ฐ€ ํ•จ๊ป˜ ์ถœ๋ ฅ๋˜๋„๋ก ํ•ด์ฃผ์‹œ๊ณ , ์ „ํ™”๋ฒˆํ˜ธ์˜ ๊ฒฝ์šฐ xxx-xxxx-xxxx ๊ฐ™์€ ํ˜•ํƒœ๋กœ ํ•˜์ดํ”ˆ ๋ฌธ์ž์—ด(-)์„ ์‚ฝ์ž…ํ•˜์—ฌ ์ถœ๋ ฅํ•ด์ฃผ์„ธ์š”.
๊ฒฐ๊ณผ๋Š” ํšŒ์› ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

  • ๋‚˜์˜ ์ฝ”๋“œ / ์˜๋„
    • concat()ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜๋ˆ ์ ธ ์žˆ๋Š” ์ปฌ๋Ÿผ์„ ํ•ฉ์นจ.
    • ๊ธ€์„ ์˜ฌ๋ฆฐ ์‚ฌ์šฉ์ž๋ฅผ ๋ณด๋Š” ๋ฌธ์ œ, inner join ์‚ฌ์šฉ
    • writer_id๋ณ„ ์—…๋กœ๋“œํ•œ ๊ธ€ ๊ฐœ์ˆ˜๊ฐ€ 3๊ฐœ ์ด์ƒ์ธ ์œ ์ € ํŒŒ์•… ์œ„ํ•ด where ์„œ๋ธŒ์ฟผ๋ฆฌ ์‚ฌ์šฉ.
      • from USED_GOODS_BOARD as b2
        ๊ธ€ ์—…๋กœ๋“œ ๋ณด๋Š” ํ…Œ์ด๋ธ”์—์„œ๋งŒ ํ™•์ธ
      • where b2.WRITER_ID = b.WRITER_ID
        ๋ฐ”๊นฅ ์ฟผ๋ฆฌ์—์„œ ํ™•์ธํ•˜๋Š” b.WRITER_ID ํ•˜๋‚˜์— ๋Œ€ํ•œ count ๊ณ„์‚ฐ.
      • group by b2.WRITER_ID
        having count(b2.WRITER_ID) >= 3
        having์— ์กฐ๊ฑด ๊ฑธ๊ธฐ ์œ„ํ•ด group by๋„ ์‚ฌ์šฉํ•œ ์ผ€์ด์Šค.
select 
    u.USER_ID
    , u.NICKNAME
    , concat(u.CITY, u.STREET_ADDRESS1, u.STREET_ADDRESS2) as "์ „์ฒด์ฃผ์†Œ"
    , concat(substr(u.TLNO, 1, 3), "-"
             , substr(u.TLNO, 4, 4), "-"
             , substr(u.TLNO, 8, 4)) as "์ „ํ™”๋ฒˆํ˜ธ"
from USED_GOODS_BOARD b
    join USED_GOODS_USER u
    on b.WRITER_ID = u.USER_ID
where b.WRITER_ID = (
    select count(b2.WRITER_ID) as cnt_writer
    from USED_GOODS_BOARD as b2
    where b2.WRITER_ID = b.WRITER_ID
    group by b2.WRITER_ID
    having count(b2.WRITER_ID) >= 3
    )
  • ์ •๋‹ต ์ฝ”๋“œ / ์˜ค๋‹ต๋…ธํŠธ

select 
    u.USER_ID
    , u.NICKNAME
    , concat(u.CITY, " ", u.STREET_ADDRESS1, " ", u.STREET_ADDRESS2) as "์ „์ฒด์ฃผ์†Œ"-- full address
    , concat(substr(u.TLNO, 1, 3), "-"
             , substr(u.TLNO, 4, 4), "-"
             , substr(u.TLNO, 8, 4)) as "์ „ํ™”๋ฒˆํ˜ธ"
from USED_GOODS_BOARD b
    join USED_GOODS_USER u
    on b.WRITER_ID = u.USER_ID
where b.WRITER_ID = (
    select c.WRITER_ID
    from (
        select 
            b2.WRITER_ID
            , count(b2.WRITER_ID) as cnt_writer
        from USED_GOODS_BOARD as b2
        where b2.WRITER_ID = b.WRITER_ID
        group by b2.WRITER_ID
        having count(b2.WRITER_ID) >= 3
        ) c
    )
group by u.USER_ID
order by u.USER_ID desc;

 

โ˜‘๏ธ 5์›” ์‹ํ’ˆ๋“ค์˜ ์ด๋งค์ถœ ์กฐํšŒํ•˜๊ธฐ [๐Ÿ”—]

`FOOD_PRODUCT`์™€ `FOOD_ORDER` ํ…Œ์ด๋ธ”์—์„œ ์ƒ์‚ฐ์ผ์ž๊ฐ€ 2022๋…„ 5์›”์ธ ์‹ํ’ˆ๋“ค์˜ ์‹ํ’ˆ ID, ์‹ํ’ˆ ์ด๋ฆ„, ์ด๋งค์ถœ์„ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ์ด๋งค์ถœ์„ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์‹œ๊ณ  ์ด๋งค์ถœ์ด ๊ฐ™๋‹ค๋ฉด ์‹ํ’ˆ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

  • ๋‚˜์˜ ์ฝ”๋“œ / ์˜๋„
    • ์ปฌ๋Ÿผ price์™€ ์ปฌ๋Ÿผ amount๋ฅผ ๊ณฑํ•˜์—ฌ ์ด๋งค์ถœ ๊ณ„์‚ฐ
    • ์ฃผ๋ฌธ์ด ์—†๋Š” ๋ฐ์ดํ„ฐ๋„ ๋ณด๊ธฐ ์œ„ํ•ด `left join`, `and` ์กฐ๊ฑด์œผ๋กœ "2022-05"์— ์ฃผ๋ฌธํ•œ row ํ•„ํ„ฐ๋ง
    • product_id์™€ product_name์€ ๋งค์นญ๋˜๋Š” ์ปฌ๋Ÿผ์ด๋‹ˆ๊นŒ, `group by` ๋Š” product_id๋กœ๋งŒ.
select
    p.PRODUCT_ID
    , p.PRODUCT_NAME
    , p.PRICE * o.AMOUNT as TOTAL_SALES
from FOOD_PRODUCT p
    left join FOOD_ORDER o
    ON p.PRODUCT_ID = o.PRODUCT_ID
    AND o.PRODUCE_DATE like "2022-05%"
group by p.PRODUCT_ID
order by TOTAL_SALES desc, p.PRODUCT_ID
  • ์ •๋‹ต ์ฝ”๋“œ / ์˜ค๋‹ต๋…ธํŠธ
    • ์ง‘๊ณ„ํ•จ์ˆ˜(sum()) ๋นผ๋จน์Œ. ๋ฐ”๋ณด๋ƒ?
    • ๋‚ ์งœ ๊ธฐ๊ฐ„์€ `like`๋ณด๋‹จ `between and`๊ฐ€ ๋” ์•ˆ์ „.
select
    p.PRODUCT_ID
    , p.PRODUCT_NAME
    , sum(p.PRICE * o.AMOUNT) as TOTAL_SALES
from FOOD_PRODUCT p
    left join FOOD_ORDER o
    ON p.PRODUCT_ID = o.PRODUCT_ID
where o.PRODUCE_DATE between "2022-05-01" and "2022-05-31"
group by p.PRODUCT_ID, p.PRODUCT_NAME
order by TOTAL_SALES desc, p.PRODUCT_ID

[๋‚ด์ผ์˜ ํ•™์Šต]

๋‚ด์ผ ์ฃผ ๋ชฉํ‘œ: ์‹œ๊ฐํ™” ๋ฐฐ์šฐ๊ธฐ ์ „, ๋” ๋ณต์žกํ•ด์ง€๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ํ•จ์ˆ˜ ์‚ฌ์šฉ์— ์ต์ˆ™ํ•ด์ง€๊ธฐ!

  • ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ/์‹œ๊ฐํ™” ์„ธ์…˜ 4ํšŒ์ฐจ
  • ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ์—ฐ์Šต (w. Claude)
  • SQL, Python ์ฝ”๋“œ์นดํƒ€