본문 바로가기
PS/SQL

[HackerRank] The Blunder

by 행복한라이언 2024. 4. 23.
728x90
반응형

문제링크

https://www.hackerrank.com/challenges/the-blunder/problem?isFullScreen=true

1. 핵심

  • [실제 급여의 평균]과 [0을 뺀 잘못된 급여의 평균]의 차이를 반올림하기
    • AVG: 급여의 평균을 구하기 위해서 사용된 함수
    • REPLACE(컬럼명, "0", ""): "0"을 공백으로 대체하기 위해 사용된 함수
    • CEIL(컬렁명): 반올림
  • 발생한 문제: "0"으로 하면 정답 / '0'으로 하면 오답
    • SQL에서는 보통 ' '을 사용하는데 " "만 정답이 되는 이유를 모르겠다. 다음은 AI의 답변이다. 
    • 이 질문에서 언급된 SQL 쿼리에 대한 문제는 문자열 리터럴을 표시하는 데 사용되는 인용 부호의 차이에서 발생합니다. SQL 표준에서는 문자열 리터럴을 표시하기 위해 싱글 쿼트(')를 사용하며, 더블 쿼트(")는 식별자(테이블 이름, 컬럼 이름 등)의 따옴표로 사용됩니다. 하지만, 여기서의 문제는 SQL 구현에 따라 다를 수 있습니다.

      - "0"을 사용했을 때 정상 동작하는 이유: 일부 SQL 데이터베이스 시스템에서는 더블 쿼트를 문자열 리터럴로 허용하기도 합니다. 특히 MySQL은 ANSI_QUOTES SQL 모드가 활성화되지 않았을 경우 더블 쿼트(")를 문자열 상수로 허용합니다. 따라서 "0"이 문자열 '0'으로 올바르게 해석되어 `replace` 함수가 예상대로 작동합니다.

      - '0'을 사용했을 때 오답이 나오는 이유: '0'은 모든 SQL 데이터베이스 시스템에서 문자열 리터럴을 나타내는 정확한 방법입니다. 따라서, '0'을 사용하는 것이 일반적으로 올바른 접근 방식입니다. 이 경우 오답이 나온다는 것은 아마도 질문의 표현이나 이해에 혼동이 있을 수 있습니다. '0'을 사용하는 것이 실제로는 정확한 방식이며, "0"이 정답으로 인식되는 것은 특정 SQL 구현의 비표준 동작 때문일 수 있습니다.

      요약하자면, '0'을 사용하는 것이 SQL 표준에 따른 올바른 방식입니다. "0"으로 정답이 나오는 경우는 특정 SQL 구현이 더블 쿼트를 문자열 리터럴로 허용하기 때문일 수 있으나, 이는 표준적인 방법은 아닙니다. 질문에서 '0'을 사용했을 때 오답이라고 한 부분은 SQL 구현의 특정 동작에 대한 오해일 가능성이 높습니다. 

2. 코드(MySQL)

with origin_table as (
    select  avg(salary) as avg_salary
    from EMPLOYEES
), error_table as (
    select avg(replace(salary, "0", "")) as avg_salary
    from EMPLOYEES
)

select ceil(O.avg_salary - E.avg_salary)
from origin_table as O, error_table as E;
728x90
반응형

'PS > SQL' 카테고리의 다른 글

[HackerRank] Weather Observation Station 13  (0) 2024.04.24
[HackerRank] Top Earners  (0) 2024.04.24
[HackerRank] Type of Triangle  (0) 2024.04.10
[HackerRank] Higher Than 75 Marks  (0) 2024.04.08
[HackerRank] Weather Observation Station 5  (0) 2024.04.06