문제 링크 : https://www.hackerrank.com/challenges/the-blunder/problem
문제 설명
- 사만다는 모든 직원들에 대해 월 평균 급여를 구하려고 한다. 그러나 그녀는 계산을 마칠때까지 키보드 숫자 0이 고장난 상태인 것을 인지하지 못했다.
- 따라서 나의 도움을 받아, 계산착오가 있었던 부분과 실제값 사이의 차이를 찾으려고 한다.
- 구하는 것 : (실제 평균값, actual) - (잘못 계산 된 평균값, miscalculated)
- 그리고 그 값을 올림하여 다음 정수값으로 나타내라.
솔루션
SELECT CEIL(AVG(Salary) - AVG(e)) AS result
FROM (
SELECT *
,CAST(REPLACE(CAST(Salary AS CHAR), '0', '') AS UNSIGNED) AS e
FROM Employees
) AS SUB
- 기존에 있었던 Employee 테이블 옆에 0이 제거된 Salary 값을 추가한다.
- Salary의 avg와 Error의 avg를 구하여 차이를 구한다.
<틀렸던 이유>
1. REPLACE 잘못 사용.
2. 'round' 글자만 보고 반올림 하는 것으로 이해함.
개념 정리
하단의 내용은 학부 때 쓰던 '이것이 MySQL이다' 전공책을 참고하여 정리하였다.
1. REPLACE 함수
REPLACE 함수의 사용법은 아래와 같다.
SELECT REPLACE(문자열, 원래 문자열, 바꿀 문자열)
-- 예시
SELECT REPLACE('이것이 MySQL이다', '이것이', 'This is')
>> 'This is MySQL이다'
사용법은 정말 쉽다. 그러나 내가 문제에서 간과했던 부분은,
REPLACE함수는 '문자열'에서만 사용할 수 있는 함수라는 것이다.
문제에서 Salary는 Integer 타입으로 정의되어 있으니, 이것을 문자열로 타입 변환한 후에 REPLACE함수를 적용해야 한다.
물론, 해커랭크에서 REPLACE((Salary), '0', '') AS e --> 이 코드로 실행해도 문제는 없다. 혹시나 해서 수정 후 돌려봤는데 정답처리가 되었다... 이유는 잘 모르겠지만, 문법의 규칙대로 작성해야 향후 코드를 재활용하거나 할 때 문제없이 실행할 수 있다고 생각하기 때문에, 규칙에 맞게 작성하고 제출했다.
1) CAST : 타입 변환 함수
CAST(expr AS 변환할 type)
-- 숫자 -> 문자열
SELECT CAST(234 AS CHAR)
>> 문자열 타입의 234
-- 문자열 -> 숫자
SELECT CAST('2' AS UNSINGED
>> 숫자 타입의 2
2. 올림/내림/반올림
1) CEIL(), CEILING() : 올림
2) FLOOR() : 내림
3) ROUND() : 반올림
SELECT CEIL(5.5) -- 6
SELECT FLOOR(5.5) -- 5
SELECT ROUND(5.842901, 3) -- 5.843
SELECT ROUND(5961.60, -2) -- 6000, 두 번째 자리(십의자리 6)에서 반올림하여 6000이 된 것.
이때, ROUND()함수에 대해 좀 더 정리해보자면.
- 자릿수 지정을 생략하는 경우, 0으로 간주되어 소수점 첫째 자리 기준으로 반올림을 한다.
- 음수를 지정해 정수 파트를 반올림 할 수도 있다.
- 인수(m) 값에 따른 반올림 위치
- 양수 : 반올림하여 m자리까지 보이게
- 생략 : 반올림하여 소수점이 안보이게 (정수형으로)
- 음수 : m자리에서 반올림
'Programming > SQL' 카테고리의 다른 글
[LeetCode] 1193. Monthly Transactions 1 - '연/월/일'에서 '연/월'만 추출하기 (0) | 2025.02.05 |
---|---|
[LeetCode] 1174. Immediate Food Delivery - AVG안에 조건식 넣기 (0) | 2025.02.03 |
[LeetCode] 1321. Restaurant Growth - 이동평균, 윈도우함수 (0) | 2025.01.26 |
[LeetCode] 1158. Market Analysis 1 - IFNULL() : 특정 컬럼값이 null일 때 0으로 표시하기 (0) | 2025.01.21 |
[LeetCode] 262. Trips and Users - LIKE 사용하여 코드 줄이기 (0) | 2025.01.17 |