본문 바로가기
나도 공부한다/SQL

프로그래머스 SQL - ROUND, TRUNC

by 꾸빵이 2024. 6. 10.

프론트엔드 개발만 하다보니 SQL 문법을 자꾸 잊어버린다. 오늘부터 두 문제씩 풀어보려고 한다.

Lv1도 풀거라서 블로그에 기록하기 민망하지만 공개적으로 글을 써야 더 꼼꼼하게 공부하게 된다.

사실 문제 풀이보다는 모르는 개념 정리 위주일 것이다.

 

그동안은 바빠서 코테 직전에 벼락치기를 했었는데 하반기를 기다리며 확실히 공부해야겠다.

 

 


 

오라클에서의 소수점을 다루는 함수를 몇개 살펴보자.

 

1. ROUND(number, decimal_places)

  • 반올림 함수
  • 지정된 소수점 자리까지 표시한다. 예를 들어, 1을 쓰면 두번째 소수점에서 반올림해서 첫번째 자리수까지 표시되는 것이다.
  • decimal_places을 생략하면 첫째자리에서 반올림한다.
  • ROUND(123.4567, 2) 결과는 123.46
  • ROUND(123.4567, 0) 결과는 123
  • ROUND(123.4567) 결과는 123
  • 날짜 데이터에도 사용이 가능하다. 이 때 TO_DATE 함수로 문자열을 날짜 데이터 타입으로 변경해줘야한다.



날짜 반올림

ROUND(TO_DATE('2023-06-15', 'YYYY-MM-DD'), 'MONTH') -- 결과는 '2023-07-01'
ROUND(TO_DATE('2023-06-15', 'YYYY-MM-DD'), 'YEAR') -- 결과는 '2024-01-01'

 

 

2. TRUNC(number, decimal_places)

  • 지정된 소수점 자리에서 숫자를 잘라낸다.
  • decimal_places를 생략하면 소수점을 모두 버리고 정수만 반환한다.
  • TRUNC(123.4567, 2) 결과는 123.45
  • TRUNC(123.4567, 0) 결과는 123
  • TRUNC(123.4567) 결과는 123

 

날짜 데이터에도 사용이 가능하다. 이 때 TO_DATE 함수로 문자열을 날짜 데이터 타입으로 변경해줘야한다.

주의해야할 점은, 자르기라고 해서 해당 일/월/년도가 잘려 사라지는 게 아니고 시작날짜(01)가 되는 것이다. 날짜 포맷은 지켜져야한다.

 


날짜 자르기

TRUNC(TO_DATE('2023-06-15', 'YYYY-MM-DD'), 'MONTH') 결과는 '2023-06-01'
TRUNC(TO_DATE('2023-06-15', 'YYYY-MM-DD'), 'YEAR') 결과는 '2023-01-01'

 

 

3. CEIL(number)

  • 올림 함수
  • 가장 가까운 큰 정수를 반환한다. 소수점 첫번째에서 올림처리하는 것과 같다.
  • CEIL(123.45) 결과는 124
  • CEIL(-123.45) 결과는 -123

 

4. FLOOR(number)

  • 내림
  • 가장 가까운 작은 정수를 반환한다. 소수점 첫번째에서 내림처리하는 것과 같다.
  • FLOOR(123.45) 결과는 123
  • FLOOR(-123.45) 결과는 -124

 


 

프로그래머스의 연관 문제

 

평균 일일 대여 요금 구하기( Lv1) 

결과값을 소수 첫 번째 자리에서 반올림해야한다.

SELECT ROUND(AVG(DAILY_FEE),0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'

 

 

가격대 별 상품 개수 구하기(Lv2) 

가격대별로 금액 구간을 그룹화하고 상품 개수를 구해야한다.

XXXX에 TRUNC(PRICE,-4)를 적용하면 0, 1XXXX에 적용하면 10000이 된다. 따라서 만원 단위로 구간을 그룹화할 수 있고, 이 개수를 카운팅해주면 된다.

-- 코드를 입력하세요
SELECT TRUNC(PRICE, -4) AS PRICE_GROUP,COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY TRUNC(PRICE, -4)
ORDER BY PRICE_GROUP