카타
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 |