본문 바로가기

TIL 통합

12/06 일지

카타

 

43. 조건에 맞는 사용자와 총 거래금액 조회하기

엑셀보다 쉬운 sql의 강의 내용만으로는 풀 수 있는 문제가 아니라고 생각해서 그냥 넘길까 하다가 앞으로도 계속 비슷한 유형이 나올 것 같아 '질문하기' 및 구글링을 통해 검색해서 풀었던 문제. 이전 문제들에서도 종종 보이던 having 함수를 처음으로 사용해봤고, 일단은 생각보다 어려운 내용은 없었다.

SELECT b.user_id,
       b.nickname,
       sum(a.price) total_sale
from used_goods_board a left join used_goods_user b on a.writer_id=b.user_id
WHERE a.status = 'done'
group by b.user_id
having sum(a.price)>=700000
order by sum(a.price) asc

 

having 함수핵심

-위치/순서 : where-group-having-order

-컴퓨터의 번역 순서 : FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY

-where에는 집계함수(sum 등)을 사용하지 못한다. 

-having은 집계함수로 조건을 걸어주는 역할을 하기에, 반드시 집계함수와 group by가 선행되어야 한다

-having은 집계함수를, where는 단일 데이터를 조건으로 건다는 차이점이 핵심!

 

 

 

44. 가격대 별 상품 개수 구하기

*floor, truncate 활용하기, 그리고 round 함수

 

문제 푸는 방식을 모르니 배웠던 내용 내에서 생각을 해보다가 피봇 테이블까지 작성해봤던 문제..ㅎ

역시나 그런 방식으로는 답이 나올 리 없었고 결국 '질문하기'를 통해 답을 얻었다.

방법은 floor 함수나 truncate함수를 사용하는 것!

#floor 함수 사용
select floor(price/10000)*10000 price_group,
       count(1) products
from product
group by 1
order by price_group asc


#truncate 함수 사용
select floor(price/10000, 0)*10000 price_group,
       count(1) products
from product
group by 1
order by price_group asc

 

floor(number)

-소수점 이하 값을 버림

-위 'floor(price/10000)'의 price/10000부분 사칙연산 값의 소수점 아래 수치가 얼마이든 정수부분만 출력

 

truncate(number, decimals)

-number를 소수점 아래 decimals번째까지 버림

-위의 'truncate(price/10000, 0)'에서 price/10000가 1.75이면 1, 만약 decimals가 1이면 1.7, 2이면 1.75

 

+혹시나 해서 별 생각 없이 round도 비슷한 함수이니 되지 않을까 싶었지만 자릿수를 삭감/버리는게 아니라 반올림 하는 거라 역시 되지 않았다.

 

 

 

48. 즐겨찾기가 가장 많은 식당 정보 출력하기

 

 

 

서브쿼리를 활용해야하는 문제인데 다른 방법이 있을 거라고 생각했다가 시간만 더 걸린 문제. 풀이는 크게 어려운 것 없지만, 첫번째 방식의 경우 where 절에 in을 사용하는 것에 더 익숙해져야할 것 같다.

 

SELECT food_type, rest_id, rest_name, favorites
from rest_info
where favorites in (select max(favorites) from rest_info group by food_type)
group by food_type
order by food_type desc
select food_type, rest_id, rest_name, favorites
from
(
select rest_name,
       food_type,
       rest_id,
       favorites,
       rank() over(partition by food_type order by favorites desc) r
from rest_info
) a
where r = 1
order by food_type desc

'TIL 통합' 카테고리의 다른 글

12/08 일지 : 서브쿼리, 중복 체크와 sum(), right(left) join, 서브쿼리 where column _name not in ()  (0) 2023.12.08
12/07 일지 having(보충)  (2) 2023.12.07
12/05 TIL  (0) 2023.12.05
12/04 일지  (2) 2023.12.04
12/01 일지  (0) 2023.12.01