안녕하세요.
rollup을 사용해서 소계를 내고자 하는데요..
예를 들어서
상품 금액
A 100
A 200
소계 300
B 300
C 200
C 500
소계 700
위처럼 해당 그룹내에 row가 2개이상일때는 소계를 뿌려주고,
B일때처럼 한 건 밖에 없을때는 소계를
안 찍어주도록 할 방법이 쿼리에서 없을까요?
도와주시면 감사하겠습니다.
꽁수 일수도 있지만... rollup 처리 해주시고 밖에서 한번더 group by 로 묶어 주시면 건수가 한건인건 하나로 묶어지 않을까요?
select name, num from ( select code, decode(count(code), 1, code, '소계') name, sum(num) num, count(code) cnt, rownum rnum from ( select 'C' code, 100 num from dual union all select 'A' code, 300 num from dual union all select 'B' code, 200 num from dual union all select 'A' code, 500 num from dual union all select 'C' code, 800 num from dual ) group by code, rollup(rownum) ) where cnt>1 or rnum is not null
전영식님 쿼리를 약간 수정했습니다.
select code, decode(count(code), 1, code, '소계') name, sum(num) num, count(code) cnt, rownum rnum
from (
select 'C' code, 100 num from dual
union all
select 'A' code, 300 num from dual
select 'B' code, 200 num from dual
select 'A' code, 500 num from dual
select 'C' code, 800 num from dual
)
group by code, rollup(rownum)
having count(code)>1 or rownum is not null
약간 더 변형해 보았습니다.
having 절에 or 연산을 피할 수 있겠죠.
with t as(
SELECT NVL2 (ROWNUM, code, '소계') code
, SUM (num) num
FROM t
GROUP BY code
, ROLLUP (ROWNUM)
HAVING COUNT (*) + NVL (ROWNUM, 0) > 1
http://www.soqool.com