원하는 항목에 대해서만 소계표시.. 1 7 723

by 동동동 [SQL Query] [2019.11.29 11:43:02]


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

 

 

by 랑에1 [2019.11.29 12:47:39]
-- 해당 샘플에만 맞춰봤습니다. 예외사항 있으면 응용하셔서 하시면 될듯하네요.

SELECT GUBUN1
     , RTRIM(MIN(GUBUN2), GROUPING_ID(GUBUN2)) AS GUBUN2
     , GRP
     , SUM(CNT1) AS CNT1
     , SUM(CNT2) AS CNT2     
  FROM TMP
 GROUP BY GUBUN1, GRP, ROLLUP(GUBUN2)
HAVING NOT(GRP <> 'A' AND GROUPING_ID(GUBUN2) = 1)  

 


by 동동동 [2019.11.29 12:56:00]

랑에님 답변 감사드립니다.

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로 되버리네요..ㅠㅠ

 


by 랑에1 [2019.11.29 13:08:44]
-- 이렇게 하실거면 GRP --> MIN(GRP)

SELECT GUBUN1
     , NVL(GUBUN2, '수행') GUBUN2
     , MIN(GRP) GRP
     , SUM(CNT1) CNT1
     , SUM(CNT2) CNT2
  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;

 


by 동동동 [2019.11.29 14:06:43]

랑에 님 추가 답변 감사드립니다..

그런데..추가 답변쿼리는 Order By가 원하는 식으로 안되네요..ㅠㅠ

 

답글 감사드립니다..


by 마농 [2019.11.29 14:17:39]

글쎄요? 정렬 문제 뿐 아니라 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 사용하나요?


by 동동동 [2019.11.29 14:35:47]

마농님 답변 감사드립니다..

랑에님이 답글 주시기 전까지 제가 ROLLUP으로 했을시에는 원하는 형태를 뽑을수가 없어서 ,

GROUPING SETS 으로 해보았습니다..

그런데 그것도 잘못 사용했군요..ㅠㅠ

 


by 대궁이 [2019.11.29 15:36:18]

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 한문장으로 안해도 될듯해서 이렇게 해봤습니다.

 

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