Table of contents
Practice Problems - Programmers Lv.2
HAVING
-- find the number of animals with the same name
select name, count(*) as count from animal_ins
where name is not null
group by name
having count(*) >= 2
order by name
-- find the average rental duration
select car_id, round(avg(datediff(end_date, start_date) + 1),1) as average_duration
from CAR_RENTAL_COMPANY_RENTAL_HISTORY c1
group by car_id
having average_duration >= 7
order by average_duration desc, car_id desc
CONCAT()
-- find the number of products by price range
-- 12340 won -> 10000, 24000 won -> 20000
select (case
when price < 10000 then 0
else concat(substring(price, 1, 1), '0000')
end) as price_group,
count(*) as products
from product
group by price_group
order by price_group
Methods for dealing with the float
ABS(숫자): 절대값을 구합니다.
CEIL(숫자): 값보다 큰 정수 중 가장 작은 정수를 구합니다. 소수점 이하 올림을 의미합니다.
FLOOR(숫자): 값보다 작은 정수 중 가장 큰 정수를 구합니다. 소수점 이하 버림을 의미합니다.
ROUND(숫자, 자릿수): 자릿수를 기준으로 반올림합니다. TRUNCATE(숫자, 자릿수) : 자릿수를 기준으로 버림합니다.
POW(X, Y) , POWER(X, Y): X의 Y승을 의미합니다.
MOD(분자, 분모): 분자를 분모로 나눈 나머지를 구합니다.
GREATEST(숫자1, 숫자2, ...): 주어진 숫자 중에 가장 큰 값을 반환합니다.
LEAST(숫자1, 숫자2, ...): 주어진 숫자 중에 가장 작은 값을 반환합니다.
Tricky Problem
ONLINE_SALE
테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요
-- return the user_id and product_id when the user purchased the same item again
select distinct o1.user_id, o1.product_id
from online_sale o1
where (
select count(o2.product_id)
from online_sale o2
where o1.user_id = o2.user_id and o1.product_id = o2.product_id
group by o2.product_id
) > 1
order by user_id, product_id desc
-- other simple solution
select user_id, product_id
from online_sale
group by user_id, product_id -- using two attributes for group by
having count(product_id) > 1
order by user_id, product_id desc