SQL 코드카타 42번
round 함수를 써서 반올림한 결과값을 표시해야 하는 문제.
round(반올림할 값, n)으로 쓴다.
이 때 n번째 자리'까지' 값을 표시한다.
즉, 소수 첫 번째 자리에서 반올림하는 것이 조건이라면
(0번째 자리까지 값을 표시해야 하므로) n 자리에 0을 넣으면 되고,
소수 둘째 자리에서 반올림해서 첫째 자리까지 표현하고 싶으면
n 자리에 1을 넣으면 되는 식.
SQL 코드카타 43번
문제에서 요구하는 조건과
발생 가능한 경우의 수를 잘 생각해야 실수가 없을 문제.
WRITER_ID별로 완료된 중고거래의 총 금액이 70만원 이상인 경우를 출력해야 하는데, 처음에 오답으로 제출한 쿼리는 이거였다.
select ugb.writer_id, ugu.nickname, sum(ugb.price)
from used_goods_board ugb
left join used_goods_user ugu on ugb.writer_id = ugu.user_id
where ugb.status = 'done'
and sum(price) >= '700000'
group by ugb.writer_id
order by sum(price)
이렇게 실행하자 Invalid use of group function
이라는 에러메시지가 떴다.
생각해 보니 같은 WRITER_ID를 가진 사람이
여러 번의 거래를 했을 경우도 있을 수 있으니
WRITER_ID 그룹별로 sum을 해 줘야 하고, (이건 함)
이 그룹별 총액이 70만을 넘어야 하므로
where절에 조건을 걸 게 아니라
group by 뒤에 having 구문을 써서 조건을 걸어야 했다. (이건 놓침)
수정된 정답 쿼리는 아래와 같다.
select ugb.writer_id, ugu.nickname, sum(ugb.price) as 'total_sales'
from used_goods_board ugb
left join used_goods_user ugu on ugb.writer_id = ugu.user_id
where ugb.status = 'done'
group by ugb.writer_id having sum(ugb.price) >= '700000'
order by sum(ugb.price);
그룹 전체에 대해 조건을 걸어야 할 때는 having을 쓰자.
SQL 코드카타 44번
금액대별로 표시를 다르게 해야 한다는 조건 때문에
case when을 써야겠구나! 싶어서 득달같이 덤벼들려다가
생각해 보니 그럴 필요까진 없었던 문제.
(case when을 쓰면 그룹별 count가 복잡해질 것 같기도 하다.)
내가 제출한 정답은
select concat(left(price,1),'0000') as 'PRICE_GROUP',
count(product_id) as 'PRODUCTS'
from product
group by left(price,1)
order by left(price,1);
이거였는데, 이 문제의 답은 맞췄지만
약점이 있는 쿼리라는 생각이 든다.
예를 들어 만약 금액대가 1,000원대, 100원대인 제품들이 끼어 있었다면 이 방법으로는 맞는 답을 구하기 어렵다.
더 다양한 케이스까지 커버할 수 있는 효과적+효율적인
쿼리문 짜는 걸 고민해 봐야겠다.
SQL 코드카타 48번
SQL 코드카타 49번
다른 포스팅에서 다루었던 서브쿼리 활용하는 문제.
사실상 거의 같은 문제인 것 같다.
1. 서브쿼리를 써서 먼저 그룹별 최대값을 정의해 놓고
2. 그걸 본 쿼리의 where 절이 받아서 컬럼에서 해당하는 값들을 매칭시켜 출력하는 방식
으로 이해하고 있다. 나중에 다른 형태의 서브쿼리 활용 문제가 나오면 별도 풀이를 적어볼 생각.
SQL 코드카타 50번
이것도 생각을 깊이 안 하고 덤볐다가 틀린 문제.
처음에 작성했던 오답 쿼리는
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
where date_format(o.produce_date,'%Y-%m') = '2022-05'
order by p.price*o.amount desc, p.product_id;
이렇게 sum과 group by를 쓰지 않은 형태였다.
하지만 같은 product_id여도 5월 초에 팔린 게 있을 수 있고 5월 말에 팔린 게 있을 수 있으니,
당연히 group by로 묶어준 뒤에 sum을 구해야 한다.
내가 제출한 정답은 이거.
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 date_format(o.produce_date,'%Y-%m') = '2022-05'
group by p.product_id
order by sum(p.price*o.amount) desc, p.product_id;
오답노트를 TIL로 적어서 나중에 보려고 하니
오답을 낼 때마다 까먹지 않고 어딘가 적어놔야 하는 번거로움이 있다. 일단은 슬랙에서 나에게 문항별 메시지를 보내고, 오답을 포함한 풀이 과정 전체를 스레드로 쭉 적어보는 방식으로 진행하는 중.
시간이 너무 걸린다 싶으면 다른 방법을 찾아야겠다.
오늘의 TIL은 끝