• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    해결됨

이런 풀이는 왜 안되는지 궁금해요

22.12.09 23:24 작성 22.12.09 23:35 수정 조회수 140

0

SELECT S.id, 
(CASE WHEN MOD(S.id,2)=0 THEN S2.student 
WHEN S.id=count(S.id) THEN S.student 
ELSE s3.student END) AS student
FROM Seat AS S INNER JOIN Seat AS S2 ON S.id -1 =S2.id 
INNER JOIN Seat AS S3 ON S.id +1 =S3.id;

짝수, 마지막 수, 홀수 기준으로 출력해주려고 하는데, 실제 output에서는 id 2인 친구만 출력이 되네요. 어떤 부분이 틀렸는지 궁금합니다!

 

+강의에서 COUNT(*)에 OVER문을 써야하는 이유도 궁금합니다. 그냥 COUNT(id)만 해도 같은 답이 되는 것 같은데 아닐까요 ㅠㅠ??

답변 1

답변을 작성해보세요.

1

group by 없이 바로 count 등의 집계함수를 사용하면 여러 개의 row가 있다 하더라도 단 하나의 row만 출력됩니다.

select id, student, count(id)
from seat

위 쿼리를 직접 돌려보시면 무슨 말인지 아실 거에요. 더 자세한 내용은 이 링크의 글을 참고해 보시면 좋을 것 같고요. 풀이 과정에서는 seat 테이블의 모든 row가 필요하기 때문에 count(id)가 아닌 count(*) over를 사용했습니다.

직접 작성하신 쿼리에서도 case 절 안의 count(S.id) 때문에 output이 한 줄만 출력되는 문제가 발생합니다. 강의 풀이처럼 여기를 count(*) over 로 바꾸는 방법이 있는데, 이렇게 해도 5줄이 아니라 3줄만 출력되고 정답 처리도 되지 않을 거에요.

왜냐하면 select 절보다 from 절의 join이 먼저 실행되기 때문입니다. join으로 서로 붙어서 만들어진 테이블로부터 select에 쓴 데이터를 가져오게 되는데, join key를 맵핑하는 과정에서 일부 row가 누락되었습니다.

s.id - 1 = s2.id  -- s.id=1일 경우 1-1=0인데 s2.id=0인 데이터는 없으므로 s.id=1인 row가 누락됩니다.
s.id + 1 = s3.id  -- s.id=5일 경우 5+1=6인데 s3.id=6인 데이터는 없으므로 s.id=5인 row가 누락됩니다.

만들어진 테이블이 모든 데이터를 포함하지 못하므로 이 안에서 연산을 해도 정답이 나오지 않습니다.