작성
·
303
0
안녕하세요!
강의를 듣다가 궁금한것이 생겨서 문의 드립니다.
-- 부서명 SALES와 RESEARCH 소속 직원별로 과거부터 현재까지 모든 급여를 취합한 평균 급여
select b.empno, max(b.ename) as ename, avg(c.sal) as avg_sal --, count(*) as cnt
from hr.dept a
join hr.emp b on a.deptno = b.deptno
join hr.emp_salary_hist c on b.empno = c.empno
where a.dname in('SALES', 'RESEARCH')
group by b.empno
order by 1;
여기서 왜 max(b.ename) 이라고 해야하는지 잘 이해가 안가서 문의 드립니다..!
감사합니다.
답변 1
0
안녕하십니까,
max(ename)에 어떤 부분이 이해가 안되는지 자세하게 적어주시지는 않았지만 일단,
강의에서도 설명드리지만,
group by 를 적용하면 select 절에 올 수 있는 것은 group by 에 사용된 컬럼과 aggregation 함수만이 올 수 있습니다.
만약 group by empno를 하게 되면 최종 만들어 지는 집합이 empno 레벨로 집합이 생성됩니다. 그런데 여기서 개별 empno에 따른 직원명(ename)을 보고자 한다면 앞에서 말씀드린 이유로 인해서 그냥 ename을 적용해서는 안됩니다.
하나의 empno로 직원명이 단 하나를 가지므로 max(ename)을 하게 되면 단 하나의 직원명만 추출하게 됩니다. ename이 문자열이기 때문에 sum(), count()와 같이 숫자값을 반환하는 함수를 적용해서는 안됩니다. 반면에 max(ename)대신, min(ename)을 적용해도 됩니다. 하나의 empno로 직원명이 단 하나이기 때문에 max나 min 모두 다 동일한 직원명을 반환하게 됩니다.
이처럼 group by 를 적용하게 되면 원래 집합에 있는 다른 컬럼들을 가져 오는데 제약이 있습니다. 실습 예제는 다른 컬럼들을 가져오는 데 제약이 있지만, 어떻게 하면 일부 컬럼들을 가져올 수 있는지(여기서는 ename)를 설명드리기 위해서 사용되었습니다.
원하시는 답변이 아니면 다시 말씀해 주십시요.
감사합니다.