Algorithm๐Ÿค/SQL

[SQL] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ (59๋ฒˆ~64๋ฒˆ) / ์ปฌ๋Ÿผ between A and B / case when ์„œ๋ธŒ์ฟผ๋ฆฌ / group by๋Š” ์ง‘๊ณ„ํ•จ์ˆ˜ ์—†์ด๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅ

ํŒŒ์นดํŒŒ์˜ค 2024. 9. 7. 17:40

 

โœ…โœ…< 59๋ฒˆ - ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก์—์„œ ๋Œ€์—ฌ์ค‘ / ๋Œ€์—ฌ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ๊ตฌ๋ถ„ํ•˜๊ธฐ >

 

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

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

<  ํ•ต์‹ฌ ๊ฐœ๋… >

 

# ์ปฌ๋Ÿผ between A and B

 

โœ”๏ธ์ˆซ์ž ๋ฒ”์œ„์—์„œ ์‚ฌ์šฉ

SELECT * 
FROM products 
WHERE price BETWEEN 100 AND 300;

 

 

โœ”๏ธ๋‚ ์งœ ๋ฒ”์œ„์—์„œ ์‚ฌ์šฉ

SELECT * 
FROM orders 
WHERE order_date BETWEEN '2024-01-01' AND '2024-03-31';

 

 

โœ”๏ธ๋ฌธ์ž์—ด ๋ฒ”์œ„์—์„œ ์‚ฌ์šฉ

SELECT * 
FROM employees 
WHERE last_name BETWEEN 'A' AND 'M';

 

 

# case when ์ปฌ๋Ÿผ in (์„œ๋ธŒ์ฟผ๋ฆฌ) then 

 

case when ์ปฌ๋Ÿผ in (์„œ๋ธŒ์ฟผ๋ฆฌ ์ปฌ๋Ÿผ) then ๊ฐ’
	 else ๊ฐ’ end

 

 

# Question )

์ €๋Š” group by๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ์ง‘๊ณ„ํ•จ์ˆ˜, count, max, min, sum, avg๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋ผ๊ณ  ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค ๊ทธ๋Ÿฌ๋‚˜ ์ •๋‹ต ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  case when ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค group by๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‚˜์š”?

 

 

# Answer )

group by๋Š” ์ง‘๊ณ„ ํ•จ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ์›ํ•˜๋Š” ๋Œ€๋กœ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

# ๋‚ด๊ฐ€ ํ‘ผ ์ฝ”๋“œ

with cte as (
    select history_id,
           car_id,
           date_format(start_date, '%Y-%m-%d') as start_date,
           date_format(end_date, '%Y-%m-%d') as end_date
    from CAR_RENTAL_COMPANY_RENTAL_HISTORY 
), cte2 as (
    select car_id,
           case when '2022-10-16' between start_date and end_date then 0
                else 1 end as availability
    from cte
)
select car_id,
       case when min(availability) = 0 then '๋Œ€์—ฌ์ค‘'
            else '๋Œ€์—ฌ ๊ฐ€๋Šฅ' end as availability
from cte2
group by car_id
order by car_id desc

 

 

 

# ์ •๋‹ต ์ฝ”๋“œ

select car_id,
       case when car_id in (
           select distinct car_id
           from CAR_RENTAL_COMPANY_RENTAL_HISTORY
           where '2022-10-16' between date_format(start_date, '%Y-%m-%d')
           and date_format(end_date, '%Y-%m-%d')
       ) then '๋Œ€์—ฌ์ค‘'
            else '๋Œ€์—ฌ ๊ฐ€๋Šฅ' end as availability
from CAR_RENTAL_COMPANY_RENTAL_HISTORY 
group by car_id
order by car_id desc

 

 

 

โœ…< 60๋ฒˆ - ๋…„, ์›”, ์„ฑ๋ณ„ ๋ณ„ ์ƒํ’ˆ ๊ตฌ๋งค ํšŒ์› ์ˆ˜ ๊ตฌํ•˜๊ธฐ >

 

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

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

 

SELECT year(SALES_DATE) as year,
       month(SALES_DATE) as month,
       gender,
       count(distinct o.user_id) as users
from ONLINE_SALE o
inner join USER_INFO u
on o.USER_ID = u.user_id
where gender is not null
group by year(SALES_DATE), month(SALES_DATE), gender
order by year(SALES_DATE), month(SALES_DATE), gender

 

 

# Question )

์™œ count(distinct o.user_id)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  count(*) ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋‹ต์ธ๊ฐ€?

 

# Answer )

์˜ˆ๋ฅผ ๋“ค์–ด์„œ 2022๋…„ / 1์›” / ์„ฑ๋ณ„์ด 1์ธ ํšŒ์›์ด ์—ฌ๋Ÿฌ๋ฒˆ ๊ตฌ๋งคํ–ˆ๋‹ค๋ฉด count(*)๋Š” ์—ฌ๋Ÿฌ๋ฒˆ ์นด์šดํŠธํ•œ๋‹ค

ํšŒ์›์˜ ์ˆ˜๋ฅผ ์…€๋•Œ๋Š” ํšŒ์›์˜ ๊ณ ์œ ํ•œ ์ˆ˜๋ฅผ ์„ธ์•ผ ํ•˜๋ฏ€๋กœ count(distinct user_id)๋กœ ์นด์šดํŠธํ•ด์•ผ ํ•œ๋‹ค

 

count(*)

null๊ฐ’ O / ์ค‘๋ณต๊ฐ’ O

 

count(์ปฌ๋Ÿผ) 

null๊ฐ’ X / ์ค‘๋ณต๊ฐ’ O

 

count(distinct ์ปฌ๋Ÿผ)

null๊ฐ’ X / ์ค‘๋ณต๊ฐ’ X

ํšŒ์›์ˆ˜๋ฅผ ์…€๋•Œ ์‚ฌ์šฉํ•œ๋‹ค

 

 

 

โœ…< 61๋ฒˆ - ์„œ์šธ์— ์œ„์น˜ํ•œ ์‹๋‹น ๋ชฉ๋ก ์ถœ๋ ฅํ•˜๊ธฐ >

 

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

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

select i.rest_id,
       i.rest_name,
       i.food_type,
       i.favorites,
       i.address,
       round(avg(review_score), 2) as score
from REST_INFO i
inner join rest_review r
on i.rest_id = r.rest_id
where address like '์„œ์šธ%'
group by i.rest_id, i.rest_name, i.food_type,
         i.favorites, i.address
order by round(avg(review_score), 2) desc, i.favorites desc

 

 

# ํ•ต์‹ฌ ๊ฐœ๋…

 

์„œ์šธ%

์„œ์šธ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ํ•„ํ„ฐ๋งํ•œ๋‹ค (์ง„์งœ์„œ์šธ)

 

%์„œ์šธ%

์„œ์šธ์ด ์•„๋‹ˆ์ง€๋งŒ ์ฃผ์†Œ ์ค‘ ์„œ์šธ์ด ๋“ค์–ด๊ฐ€๋Š” ์ฃผ์†Œ๋ฅผ ํ•„ํ„ฐ๋งํ•œ๋‹ค (๊ฐ€์งœ์„œ์šธ)

 

 

 

< 62๋ฒˆ - ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก์—์„œ ์žฅ๊ธฐ/๋‹จ๊ธฐ ๋Œ€์—ฌ ๊ตฌ๋ถ„ํ•˜๊ธฐ >

 

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

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

SELECT history_id, car_id,
       date_format(start_date, '%Y-%m-%d') as start_date,
       date_format(end_date, '%Y-%m-%d') as end_date,
       case when timestampdiff(day, start_date, end_date) >= 29 then '์žฅ๊ธฐ ๋Œ€์—ฌ'
            else '๋‹จ๊ธฐ ๋Œ€์—ฌ' end as rent_type
from CAR_RENTAL_COMPANY_RENTAL_HISTORY 
where year(START_DATE) = 2022 and month(START_DATE) = 9
order by history_id desc

 

# ์ˆซ์ž๋กœ order by ์ง€์ •๊ฐ€๋Šฅํ•˜๋‹ค

 

# timestampdiff ์กฐ๊ฑด์— ๋”ฐ๋ผ์„œ +1์„ ํ•ด์•ผํ•  ์ˆ˜๋„ ์žˆ๋‹ค

 

 

< 63๋ฒˆ - ์ž๋™์ฐจ ํ‰๊ท  ๋Œ€์—ฌ ๊ธฐ๋ก ๊ตฌํ•˜๊ธฐ >

 

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

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

select car_id,
       round(avg(timestampdiff(day, start_date, end_date)+1),1) as AVERAGE_DURATION
from CAR_RENTAL_COMPANY_RENTAL_HISTORY 
group by car_id
having round(avg(timestampdiff(day, start_date, end_date)+1),1) >= 7
order by 2 desc, 1 desc

 

 

 

< 64๋ฒˆ - ํ—ค๋น„ ์œ ์ €๊ฐ€ ์†Œ์œ ํ•œ ์žฅ์†Œ >

 

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

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

select *
from PLACES 
where host_id in (
    select host_id
    from PLACES 
    group by host_id
    having count(*) >= 2
)
order by id