WITH TMP AS ( SELECT '홍길동' GUBUN1, '수행1' GUBUN2, 'A' GRP, 1 CNT1, 0 CNT2 FROM DUAL UNION ALL SELECT '홍길동' GUBUN1, '수행2' GUBUN2, 'A' GRP, 3 CNT1, 1 CNT2 FROM DUAL UNION ALL SELECT '홍길동' GUBUN1, '미수행1' GUBUN2, 'B' GRP, 2 CNT1, 1 CNT2 FROM DUAL UNION ALL SELECT '홍길동' GUBUN1, '미수행2' GUBUN2, 'C' GRP, 0 CNT1, 1 CNT2 FROM DUAL UNION ALL SELECT '김삿갓' GUBUN1, '수행1' GUBUN2, 'A' GRP, 0 CNT1, 2 CNT2 FROM DUAL UNION ALL SELECT '김삿갓' GUBUN1, '수행2' GUBUN2, 'A' GRP, 1 CNT1, 1 CNT2 FROM DUAL UNION ALL SELECT '김삿갓' GUBUN1, '미수행1' GUBUN2, 'B' GRP, 0 CNT1, 1 CNT2 FROM DUAL UNION ALL SELECT '김삿갓' GUBUN1, '미수행2' GUBUN2, 'C' GRP, 0 CNT1, 1 CNT2 FROM DUAL ) SELECT GUBUN1 , GUBUN2 , GRP , CNT1 , CNT2 FROM TMP;
안녕하세요..해당 쿼리를 실행하면
GUBUN1 | GUBUN2 | GRP | CNT1 | CNT2 |
홍길동 | 수행1 | A | 1 | 0 |
홍길동 | 수행2 | A | 3 | 1 |
홍길동 | 미수행1 | B | 2 | 1 |
홍길동 | 미수행2 | C | 0 | 1 |
김삿갓 | 수행1 | A | 0 | 2 |
김삿갓 | 수행2 | A | 1 | 1 |
김삿갓 | 미수행1 | B | 0 | 1 |
김삿갓 | 미수행2 | C | 0 | 1 |
다음과 같은 결과가 나오는데요..
여기서 수행에 해당하는 것만 소계로 추가 표시를 하고 싶은데요..도움 부탁 드립니다..
ROLLUP으로 하려해도..능력 부족이네요..ㅠㅠ
GUBUN1 | GUBUN2 | GRP | CNT1 | CNT2 |
홍길동 | 수행1 | A | 1 | 0 |
홍길동 | 수행2 | A | 3 | 1 |
홍길동 | 수행 | A | 4 | 1 |
홍길동 | 미수행1 | B | 2 | 1 |
홍길동 | 미수행2 | C | 0 | 1 |
김삿갓 | 수행1 | A | 0 | 2 |
김삿갓 | 수행2 | A | 1 | 1 |
김삿갓 | 수행 | A | 1 | 3 |
김삿갓 | 미수행1 | B | 0 | 1 |
김삿갓 | 미수행2 | C | 0 | 1 |
랑에님 답변 감사드립니다.
WITH TMP AS ( SELECT '홍길동' GUBUN1, '수행1' GUBUN2, 'A' GRP, 1 CNT1, 0 CNT2 FROM DUAL UNION ALL SELECT '홍길동' GUBUN1, '수행2' GUBUN2, 'A' GRP, 3 CNT1, 1 CNT2 FROM DUAL UNION ALL SELECT '홍길동' GUBUN1, '미수행1' GUBUN2, 'B' GRP, 2 CNT1, 1 CNT2 FROM DUAL UNION ALL SELECT '홍길동' GUBUN1, '미수행2' GUBUN2, 'C' GRP, 0 CNT1, 1 CNT2 FROM DUAL UNION ALL SELECT '김삿갓' GUBUN1, '수행1' GUBUN2, 'A' GRP, 0 CNT1, 2 CNT2 FROM DUAL UNION ALL SELECT '김삿갓' GUBUN1, '수행2' GUBUN2, 'A' GRP, 1 CNT1, 1 CNT2 FROM DUAL UNION ALL SELECT '김삿갓' GUBUN1, '미수행1' GUBUN2, 'B' GRP, 0 CNT1, 1 CNT2 FROM DUAL UNION ALL SELECT '김삿갓' GUBUN1, '미수행2' GUBUN2, 'C' GRP, 0 CNT1, 1 CNT2 FROM DUAL ) SELECT GUBUN1 , NVL(GUBUN2, '수행') GUBUN2 , GRP , SUM(CNT1) CNT1 , SUM(CNT2) CNT2 -- , GROUPING(GUBUN1) -- , GROUPING(GUBUN2) -- , GROUPING(GRP) -- , GROUPING_ID(GUBUN2,GRP) ID FROM TMP GROUP BY GROUPING SETS(GUBUN2, GRP), GUBUN1 HAVING (GROUPING_ID(GUBUN2,GRP) = 1 OR (GROUPING_ID(GUBUN2,GRP) = 2 AND GRP = 'A')) ORDER BY GUBUN1, GUBUN2, GRP;
저는 이렇게 해봤는데 Order BY도 제대로 안되고 GRP가 Null로 되버리네요..ㅠㅠ
글쎄요? 정렬 문제 뿐 아니라 Grouping Sets 를 잘 못 사용한 듯 한데요.
사용하신 GROUP BY GROUPING SETS(gubun2, grp), gubun1 은
(gubun1, gubun2) 기준 집계와 (gubun1, grp) 기준 집계가 있는 형태입니다.
하지만 원하는 것은
(gubun1, grp, gubun2) 기준 집계와 (gubun1, grp) 기준 집계가 있어야 하므로
다음과 같은 형태가 되어야 합니다.
GROUP BY GROUPING SETS ((gubun1, grp, gubun2), (gubun1, grp))
GROUP BY gubun1, GROUPING SETS ((grp, gubun2), (grp))
GROUP BY gubun1, grp, GROUPING SETS ((gubun2), ())
그런데?
간단하게 롤업하면 되는데 굳이 어렵게 grouping sests 사용하나요?
SELECT GUBUN1,GUBUN2,GRP,CNT1,CNT2
FROM (
SELECT GUBUN1,GUBUN2,GRP,CNT1,CNT2,0 AS SORT
FROM TMP
UNION ALL
SELECT GUBUN1,GUBUN2,GRP,SUM(CNT1) AS CNT1, SUM(CNT2) AS CNT2, 1 AS SORT
FROM (
SELECT GUBUN1
, CASE WHEN GUBUN2 LIKE '수행%' THEN '수행' ELSE NULL END AS GUBUN2
, GRP
, CNT1
, CNT2
FROM TMP
)
GROUP BY GUBUN1,GUBUN2,GRP
HAVING GUBUN2 IS NOT NULL
)
ORDER BY GUBUN1 DESC ,GRP,SORT
;
해당 데이터에 대해서는 구지 SQL 한문장으로 안해도 될듯해서 이렇게 해봤습니다.