by 토로 [SQL Query] SUBQUEARY GROUP BY not a single-group ORA-00937 [2020.12.22 08:49:28]
안녕하세요.
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에 잘 뜹니다. 둘의 차이를 잘 모르겠네요...
힌트라도 얻고 싶은 심정입니다. 구글링하고 머리를 싸매도 잘 풀리지 않네요.
횡설수설 질문했는데 다음 번엔 좀 더 똑부러지게 질문할 수 있도록 공부 열심히 할게요...!
감사합니다.
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) ;