그룹 함수와 select절의 컬럼 관계에 대해 질문이 있습니다. 0 4 10,417

by 토로 [SQL Query] SUBQUEARY GROUP BY not a single-group ORA-00937 [2020.12.22 08:49:28]


Q1222.JPG (41,056Bytes)

안녕하세요.

sql 기초를 다지는 중인 초보 토토입니다.

쿼리를 이리저리 짜보던 와중에, 

ORA-00937: not a single-group group function 라는 오류가 떴습니다.

구글링 해보니 그룹 함수는 결과가 1개이므로.

여러 결과값을 가진 단일 컬럼은 쓰면 안 된다고 합니다. (말이 좀 어렵지만 이해하려 노력 중입니다. 분발하겠습니다.)

 

 

--1)
SELECT DEPT_CODE, MAX(SUM(SALARY))
FROM EMPLOYEE
GROUP BY DEPT_CODE;

--2)
SELECT DEPT_CODE "부서 코드", SUM(SALARY) "급여 합계"
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING SUM(SALARY) = 17700000;

 

그런데 GROUP BY절에 쓰인 컬럼은 SELECT에서 조회할 수 있다고 하는데

1) 쿼리문에서 왜 DEPT_CODE를 넣으면 오류가 뜰까요?

그 아랫줄 2) 쿼리문은 DEPT_CODE도 함께 오류 없이 RESUL SET에 잘 뜹니다. 둘의 차이를 잘 모르겠네요...

힌트라도 얻고 싶은 심정입니다. 구글링하고 머리를 싸매도 잘 풀리지 않네요.

횡설수설 질문했는데 다음 번엔 좀 더 똑부러지게 질문할 수 있도록 공부 열심히 할게요...!

감사합니다.

by 마농 [2020.12.22 12:34:56]

1) 번은 두번에 걸쳐서 집계를 했네요. 1차 SUM, 2차 MAX
- 1차 SUM 은 dept_code 기준 집계이고
- 2차 MAX 은 1차 SUM 의 결과를 다시 한번 전체 기준 집계한 것입니다.
- 1차 집계 결과가 여러건(부서수) 이라면
- 2차 집계 결과는 1건(전체) 입니다
- 결과는 1건인데 여러건을 함께 보여준다는게 말이 안되죠.

-- 1)번 (집계함수 중첩 사용) 구문은 오라클에서만 허용되는 구문입니다.
-- 타 DB 에서도 동작하려면 다음과 같은 구문이 됩니다
SELECT MAX(sum_salary) max_sum_salary
  FROM (SELECT dept_code
             , SUM(salary) sum_salary
          FROM employee
         GROUP BY dept_code
        ) a
;
-- 2)번 쿼리는 1번 쿼리의 결과를 상수값 조건으로 줬네요.
-- 1)번 쿼리의 결과가 얼마인지 모른다면 1)번 쿼리 자체를 조건에 넣어 주면 됩니다.
SELECT dept_code "부서 코드"
     , SUM(salary) "급여 합계"
  FROM employee
 GROUP BY dept_code
--HAVING SUM(salary) = 17700000
HAVING SUM(salary) = (SELECT MAX(SUM(salary)) FROM employee GROUP BY dept_code)
;

 


by 토로 [2020.12.22 22:17:56]

선생님, 이해에 많은 도움이 되었습니다. 감사합니다! 

 

EMPLOYEE 테이블에 SALARY 컬럼은 있지만,

이를 더하고( SUM( ) ), 그 중에서 최대를 찾는( MAX( ) ) 함수를 사용한 컬럼값은 따로 안 들어 있으니

이에 대응하는 DEPT_CODE를 조회하지 못하는 거라 이해해도 될까요?

GROUP BY로 DEPT_CODE마다 그룹으로 묶어줘서 부서 코드도 같이 알 수 있을 거라 생각했는데 아닌가 봅니다 .. ㅠㅠ

 


by 마농 [2020.12.23 07:53:37]

"GROUP BY로 DEPT_CODE마다 그룹으로 묶어줘서 부서 코드도 같이 알 수 있을 거라 생각" 한 것은 SUM 까지 입니다.
한단계 더 나아가 MAX 를 한 부분에서는 GROUP BY 가 없습니다.
제가 이해하기 쉽도록 2단계로 풀어낸 쿼리를 참고하세요.


by 토로 [2020.12.23 14:17:30]

감사합니다! 적어주신 쿼리문 잘 소화해보겠습니다 :)

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입