WITH t AS ( SELECT 1 s, 'A' h, 1 k, 100 g FROM dual UNION ALL SELECT 1, 'A', 1, 100 FROM dual UNION ALL SELECT 1, 'B', 1, 200 FROM dual UNION ALL SELECT 1, 'B', 1, 200 FROM dual UNION ALL SELECT 2, 'A', 1, 300 FROM dual UNION ALL SELECT 2, 'A', 1, 300 FROM dual ) SELECT DECODE(GROUPING_ID(s, h) , 3, '합계', 1, s||'소관합계' , NULLIF(s||'소관', LAG(s||'소관') OVER(PARTITION BY GROUPING(h) ORDER BY h)) ) s , h , k , SUM(g) g FROM t GROUP BY ROLLUP(s, (h, k)) ORDER BY t.s NULLS FIRST, t.h NULLS FIRST ;
-- 쿼리 공부중이라 마농님꺼 참고해서 작성해 보았습니다. -- 마농님께는 참 배울게 많은거 같아요 ^^; WITH TMP_TEST AS ( select 1 "S", 'A' "H", 1 "K", 100 "G" from dual union all select 1 "S", 'A' "H", 1 "K", 100 "G" from dual union all select 1 "S", 'B' "H", 1 "K", 200 "G" from dual union all select 1 "S", 'B' "H", 1 "K", 200 "G" from dual union all select 2 "S", 'A' "H", 1 "K", 300 "G" from dual union all select 2 "S", 'A' "H", 1 "K", 300 "G" from dual ) SELECT DECODE(GROUPING(S)||GROUPING(H) ,'11','합계' ,'01', S||'소관합계' ,DECODE(RANK()OVER(PARTITION BY S ORDER BY H),1,S||'소관')) AS "소관" , H AS "회계" , K AS "계정" , SUM(G) AS "금액" FROM TMP_TEST GROUP BY ROLLUP(S,H,K) HAVING NOT(GROUPING(S) = 0 AND GROUPING(H) = 0 AND GROUPING(K) = 1) ORDER BY GROUPING(S) DESC, S ASC , GROUPING(H) DESC, "회계" ASC ;