작성
·
128
0
안녕하세요:) 강의 잘 듣고 있어요
현 게시판에 이미 게시되어있는 MIN에 관한 질문이 있어서 이렇게 글을 남겨요.
피봇팅을 할때 마지막에 MIN을 붙여서 쿼리를 완성하셨는데,
그렇다면 만약에 MIN을 붙이지 않아도 되는 건가요?
MIN을 안 붙이고 했는데 오류가 뜨더라고요. 이 부분에 대해 설명해주시면 감사드릴게요!
SELECT CASE WHEN Occupation = 'Doctor' THEN Name Else Null END
, CASE WHEN Occupation = 'Professor' THEN Name Else Null END
, CASE WHEN Occupation = 'Singer' THEN Name Else Null END
, CASE WHEN Occupation = 'Actor' THEN Name Else Null END
FROM (
SELECT occupation
, name
, ROW_NUMBER() over (PARTITION BY Occupation ORDER BY Name) rn
FROM Occupations
) AS a
GROUP BY rn
ORDER BY rn;
답변 1
0
피봇팅을 할 때는 MIN, MAX, AVG, SUM 등 집계 함수를 꼭 써 주셔야 합니다.
적어 주신 쿼리는 아래와 같은 Occupations 테이블의 row를 하나씩 체크하면서 4개의 컬럼 값을 채워 나갑니다.
첫 번째 row의 occupation은 doctor 이므로 첫 번째 컬럼에 name(samantha)가 들어가고, 나머지 컬럼에는 null이 들어갑니다.
두 번째 row의 occupation은 actor 이므로 네 번째 컬럼에 name(julia)가 들어가고, 나머지 컬럼에는 null이 들어갑니다.
이런 일을 마지막 row까지 반복하고 나면 아래와 같은 테이블이 만들어 집니다.
그런데 우리가 원하는 결과물은 이렇게 null로 구멍이 뚫린 모습이 아니라 rn 값 순으로 위에서부터 값이 채워진 테이블이죠.
그래서 rn을 기준으로 그룹을 묶어 그 그룹 내에서 집계를 하는 것입니다.
유일한 이름(ex- samantha)와 null들 사이에서 MIN, MAX, AVG, SUM 등 어떤 집계를 하든 답은 유일한 이름 값으로 나오기 때문에 꼭 MIN이 아니어도 됩니다.