아직 쿼리언어의 원리를 잘 모르는것 같아요. 0 5 1,167

by 나구니 [Oracle 기초] [2010.03.11 10:37:00]



select job,ename,empno,avg(sal)
from emp
group by job,ename,empno

위의 쿼리는 되는데 왜 아래의 쿼리는 실행이 안되는지 모르겟습니다. 

select job,ename,empno,min(avg(sal))
from emp
group by job,ename,empno


그륩함수를 중첩처리할려고 하는데 이렇게 하는게 아닌가요?
의도는 평균급여 중 가장 작은 값을 뽑을려고 그러는데..
단일 그룹의 그룹함수가 아니라네요;; 먼 말인지 -.-;

뭐가 문제 인지 가르침 부탁 드립니다...
by po1010 [2010.03.11 11:10:15]
SELECT 절에 그룹함수를 사용할려면 GROUP BY 절에 명시를 해야합니다.
위에 쿼리에서는 그룹함수를 그룹함수안에 사용했기 때문에
SELECT 절에 JOB, ENAME, EMPNO 절에도 그룹함수를 적용해야 합니다.

by [리베™] [2010.03.11 13:32:29]
위의 두 쿼리의 의도 자체가 잘못된게 아닌가요??
불가능하겠지만, 설사 아래의 쿼리가 정상적으로 시행이 됐다고 Job, empname, empno별 sal의 평균값을 산정한 후, sal 평균값이 최소값이라는게
평균값만 구한것과 동일한 값이 나올텐데요.

단순히 위의 쿼리문의 결과 중에서 최소 sal의 값이 얼마인것인지가 궁금한 것이라면, 간단하게 아래와 같이 하면 될듯 합니다.

select min(sal)
from (select job,ename,empno,avg(sal) as sal
from emp
group by job,ename,empno)

by proud [2010.03.11 13:36:01]
그룹함수의 개념을 접어두고 우선은 구문 오류입니다.

그룹핑 한번에 여러개의 그룹함수는 허용하지만 그룹함수를 겹겹이 쓰는 것은 허용하지 않아 나는 오류입니다.

사실 머 테스트 쿼리라 원래 데이터의 의미를 생각지 않고 원하시는 답을 보더라도 약간 이해되지 않는 부분이 있습니다.

select job,ename,empno,avg(sal)
from emp
group by job,ename,empno



select job,ename,empno,min(avg(sal))
from emp
group by job,ename,empno

이란 쿼리가 만약 실행가능하다 가정했을때의 값은 서로 동일합니다.

왜냐하면 이미 avg함수를 통해 job, ename, empno 별로 평균값 1개만이 존재하기 때문에 각각 평균값 1개만 가진 값에서 가장 작은 것은 그 값이기 때문입니다.

물론 아래와 같이 바꾸면 실행가능하기도 합니다.
select job,ename,empno,min(avg_sal)
from (
select job,ename,empno,avg(sal) avg_sal
from emp
group by job,ename,empno
)
group by job,ename,empno
뭐 실행은 되겠죠...

그러나 예상하건데 원하시는 답이
select min(avg_sal)
from (
select job,ename,empno,avg(sal) avg_sal
from emp
group by job,ename,empno
)

이 쿼리의 결과가 맞으리라 생각됩니다.

by 마농 [2010.03.12 09:52:45]
우선 녹색쿼리는 그룹바이 항목중 empno 라는 유일키항목이 포함되어 있어 그룹바이가 무의미합니다.
즉 평균이 아닌 그냥 값이나 다를바 없구요.

일단 이건 그냥 넘어간다고 치고 빨간색 쿼리를 보면
평균값중 제일 작은값을 가져오려면?
SELECT MIN(AVG(sal))
FROM emp
GROUP BY job, ename, empno
;
이렇게 이중 그룹함수도 사용 가능합니다.
다만 이때 Select절에 다른 항목이 와서는 안되죠.

그런데 원하는 값이 작은값이 아니고 작은 값에 해당하는 empno라면?
SELECT *
FROM
(
SELECT job, ename, empno, AVG(sal) avg_sal
FROM emp
GROUP BY job, ename, empno
ORDER BY avg_sal
)
WHERE ROWNUM = 1
;

억지쿼리를 만들어 드렸습니다만 우선 질문 쿼리부터가 억지스럽네요.

by 나구니 [2010.03.15 12:07:26]
다들 깊이 있는 답변들 감사드립니다. 제가 주말 동안 확인을 못해서 이제야 글을 보내요 쿼리를 짜기전 데이터간의 관계 파악을 통한 결과값의 의미를 예상해보는 것이 무엇보다 중요하다는걸 알았어요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입