그룹함수 쿼리 컬럼에 그룹함수 스칼라 쿼리 0 3 1,091

by 민트에이드 [Oracle 기초] [2022.10.20 11:16:56]


안녕하세요.

그룹함수에 대한 기초가 부족해서 인지.. 쿼리가 동작하지 않는 이유가 잘 이해가 안 되어서 질문을 드려요. 

with t1 as (
select 'A' as cnum, 2500 pnt, 500 usepnt from dual union all
select 'B' as cnum, 4000 pnt, 1000 usepnt from dual
),
t2 as (
select 'A' as cnums, 1000 savepnt, 0 usepnt from dual union all
select 'A' as cnums, 1000 savepnt, 0 usepnt from dual union all
select 'A' as cnums, 1000 savepnt, 500 usepnt from dual union all
select 'B' as cnums, 5000 savepnt, 1000 usepnt from dual

)
select sum(pnt) pnt1, (select sum(savepnt - usepnt) from t2 where cnums = 'A') as pnt2
from t1
where cnum = 'A'
group by cnum

위 쿼리는 잘 동작하는데요. 

저 쿼리에서 group by cnum을 지우면 "단일 그룹의 그룹 함수가 아닙니다" 라는 오류가 납니다.

제가 기대한 결과는  group by cnum가 없어도 pnt2 컬럼 값이 나오는 것이었는데요. 

어떤 이유에서 group by cnum 이 있느냐 없느냐에 따라 결과가 달라지는 것 인가요..? 

그룹함수에 대해 제대로 알지 못 한 부분이 무엇인지 궁금합니다.

by ㅇㅇ준 [2022.10.20 14:58:09]

MAX(select sum(savepnt - usepnt) from t2 where cnums = 'A')


by 마농 [2022.10.20 15:04:34]

딱히 이유는 없어 보입니다.
에러가 나는게 맞는지? 안나는게 맞는지도 모호하네요.
그냥 에러를 피해가야 할 것 같습니다.
1. (편법) 서브쿼리를 집계함수로 감싸기 : MIN((SELECT ~ ))
2. (편법) 아무거나 GROUP BY 추가하기 : GROUP BY NULL
3. (추천) 쿼리 뜯어 고치기 : 에러 원천 차단, 간결하게. 굳이 스칼라서브쿼리를 쓸 이유가 없어 보입니다.
SELECT pnt1, pnt2
  FROM (SELECT SUM(pnt) pnt1 FROM t1 WHERE cnum = 'A')
     , (SELECT SUM(savepnt - usepnt) pnt2 FROM t2 WHERE cnums = 'A')
;


by 민트에이드 [2022.10.21 11:49:57]

ㅇㅇ준님, 마농님 답을 주셔서 감사합니다. ^^

에러는 피해가야 하는게 지혜죠. 답해주셔서 시간 절약했습니다~

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