• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

The report 관련 질문드립니다.

21.01.07 00:57 작성 조회수 90

1

안녕하세요, 강의 듣기 전 혼자 풀어보았는데요

저는 우선 between join 한 aa 테이블을 만들고,

grade가 8 이상인 테이블 bb, grade가 8 미만인 테이블 cc를 만들어 각각 order by 조건을 건 뒤 union을 통해 합쳐주는 쿼리문을 작성했습니다.

bb 테이블, cc 테이블의 결과를 각각 확인해보면 정답과 일치하는데

이 둘을 union으로 합치기만 하면 결과가 정답과 다르게 나오네요..

어디서 문제가 발생했는지 알고싶습니다.. ㅠㅠ

with aa as (

    select s.name, g.grade, s.marks 

    from students as s, grades as g

    where s.marks between g.min_mark and g.max_mark

)

select *

from (

    select *

    from aa

    where grade >= 8

    order by grade desc , name asc

) bb

UNION 

select *

from (

    select case when grade <= 7 then name = null end , grade, marks

    from aa

    where grade between 1 and 7

    order by grade desc, marks asc

) cc

답변 1

답변을 작성해보세요.

1

안녕하세요 이명아님, 답변 드립니다.

질문에 올려주신 쿼리를 실행해보면, 결과값 정렬이 의도한 대로 출력되지 않는 것을 보실 수 있습니다.
union 사용 시 최종 결과에 대해 정렬이 필요한 경우, order by를 마지막에 사용해주셔야 합니다. 따라서 작성하신 쿼리의 마지막에 order by grade desc, name, marks 를 추가해주시면 정답과 결과가 일치합니다.

참고: [MySQL] ORDER BY and LIMIT in Unions
"
To use an ORDER BY or LIMIT clause to sort or limit the entire UNION result, parenthesize the individual SELECT statements and place the ORDER BY or LIMIT after the last one:
"

답변이 도움이 되었길 바라며, 추가 질문이 있으실 경우 언제든 남겨주세요 :)