인프런 커뮤니티 질문&답변

데잇걸즈4기_박유빈님의 프로필 이미지

작성한 질문수

[백문이불여일타] 데이터 분석을 위한 고급 SQL

HACKER RANK THE REPORT 문제 관련 질문 드립니다.

20.08.22 23:35 작성

·

341

2

안녕하세요! 저번에 상세한 답변 감사드립니다.

아래 문제 관련 2가지 질문 드립니다.

-문제: HACKER RANK > THE REPORT

1.

-질문: ORDER BY 에서 WITH문을 불러올 수 없는지 궁금합니다.

 with statement를 이 문제에 적용해보려고 시도했습니다.

ORDER BY절에 WITH를 불러와서 써먹고 싶었는데,  오류가 뜨네요.

참고로 문제는 아직 푸는 중입니다.

-오류: 오류 내용은 아래와 같고, ORDER BY를 제외하면 쿼리 에러가 나지 않습니다.

  • ERROR 1370 (42000) at line 1: execute command denied to user '@'localhost' for routine 'counter.COUNT'

-쿼리:

WITH counter AS (SELECT COUNT(name)

                 FROM sub

                 GROUP BY grade)

SELECT (CASE

            WHEN grade < 8 THEN name = "NULL"

            ELSE name

        END) name

        , grade

        , marks

FROM (SELECT *

    FROM students

    LEFT JOIN grades ON students.marks BETWEEN grades.Min_Mark AND grades.Max_Mark

    ) sub

ORDER BY (CASE WHEN counter < 1 THEN marks END) DESC

2.

-질문: JOIN을 활용한 FROM  절에 ALIAS를 넣는게 필수인가요?

아래 쿼리에서 FROM 절 서브 쿼리 뒤에  ALIAS를 넣지 않고 쿼리를 돌리면  오류가 뜹니다.

오류에서 말하는 'derived table'의 의미가 모호한데, 정확히 어떤 뜻인가요?

-오류: "Every derived table must have its own alias"

-쿼리: 

SELECT (CASE

WHEN grade < 8 THEN NULL ELSE name END) name

, grade

, marks

FROM (SELECT * FROM students LEFT JOIN grades ON students.marks BETWEEN grades.Min_Mark AND grades.Max_Mark) sub

답변 달아주시는 분께 미리 감사합니다:)

답변 1

2

송혜정님의 프로필 이미지
송혜정
지식공유자

2020. 08. 30. 23:30

안녕하세요 유빈님, 답변 드립니다.

1.
우선, 작성해주신 쿼리에서는 해당 WITH절을 사용하지 않고, SELECT에 적어주신 grade, name, marks를 ORDER BY절에 적절히 적어주시면 올바른 답을 확인하실 수 있습니다. 또한 WITH절에 만들어진 테이블은 FROM 혹은 JOIN절로 불러와 사용하실 수 있으며, counter 테이블을 단독으로 ORDER BY 로 불러와 사용하실 수는 없습니다. 적어주신 쿼리에서 WITH절을 사용하시고자 한다면 FROM절에 적어주신 sub 서브쿼리를 WITH절로 빼서 사용하는 것이 더 나을 것 같습니다.

추가로, 문제에서 출력하라고 한 null은 문자가 아니라 null이라는 속성 입니다. null에 대해 정리된 링크를 첨부하오니 참고해주시면 좋을 것 같네요. [essentialsql.com] What is a Database NULL Value?  CASE 문도 다시 한번 복습 하시면서, CASE문 안에서 null이 출력되는 때는 언제인지, 그렇다면 작성한 쿼리를 어떻게 수정해야 할 지 생각해보시면 좋겠습니다. [w3schools.com] SQL CASE Statement  /  [중급 강의] CASE

2.
이는 쿼리를 실행하는 환경에 따라 Alias 필요 여부가 달라집니다. 다만 쿼리가 길어질 경우, 여러 서브쿼리를 서로 구분하거나 쿼리에 대한 이해를 돕기 위해 Alias를 사용하는 것이 좋습니다. 따라서 Alias는 항상 적는 습관을 들이시는 걸 추천 드립니다.

늦은 답변 양해 부탁 드리며 답변이 도움이 되었길 바랍니다.
추가 질문 있으시면 언제든 남겨주세요 :)