오라클 그룹바이 ROLLUP 관련 질문 드려요 0 6 974

by 초봉 [SQL Query] [2018.11.12 12:15:42]


쿼리를 짜던중에 진행이 안되서 도움을 요청드립니다.

GP_NO GP_PROJECT_CD NO PROJECT_CD PROJECT_NM
0 0 A001 NP0001 수행1
0 0 A001 NP0002 수행2
0 1 과제건수   2
0 0 A002 NP0003 수행3
0 0 A004 NP0004 수행4
0 1     2
1 1 합계   4

이렇게 조회 되는것을

GP_NO GP_PROJECT_CD NO PROJECT_CD PROJECT_NM
0 0 A001 NP0001 수행1
0 0 A001 NP0002 수행2
0 1 과제건수   2
0 0 A001 NP0003 수행3
0 0 A001 NP0004 수행4
0 1 과제건수   2
1 1 합계   4
1 1 형태별합계   3

맨하위의 ROW 넣기 위해서 기준이 딱히 SHAPE 건수 세는것 밖에 없는데 가능한가요??

이렇게 형태건수를 한 ROW 맨 아래쪽 A001 사람의 아래쪽에 넣고 싶습니다.

예시쿼리는 아래와 같습니다.

/* Formatted on 2018/11/12 오후 1:43:45 (QP5 v5.256.13226.35510) */
WITH T
     AS (SELECT 'A001' AS NO
               ,'NP0001' AS PROJECT_CD
               ,'Q0001' AS SHAPE
               ,1 AS BUSI
               ,'수행1' AS PROJECT_NM
           FROM DUAL
         UNION ALL
         SELECT 'A001' AS NO
               ,'NP0002' AS PROJECT_CD
               ,'Q0001' AS SHAPE
               ,NULL AS BUSI
               ,'수행2' AS PROJECT_NM
           FROM DUAL
         UNION ALL
         SELECT 'A001' AS NO
               ,'NP0003' AS PROJECT_CD
               ,'' AS SHAPE
               ,1 AS BUSI
               ,'수행3' AS PROJECT_NM
           FROM DUAL
         UNION ALL
         SELECT 'A001' AS NO
               ,'NP0004' AS PROJECT_CD
               ,'Q0001' AS SHAPE
               ,NULL AS BUSI
               ,'수행4' AS PROJECT_NM
           FROM DUAL)
  SELECT GROUPING (NO) AS GP_NO
        ,GROUPING (PROJECT_CD) AS PROJECT_CD
        ,GROUPING (BUSI) AS BUSI
        ,CASE
            WHEN     GROUPING (NO) = 0
                 AND GROUPING (PROJECT_CD) = 1
                 AND GROUPING (BUSI) = 0
            THEN
               '과제건수'
            WHEN     GROUPING (NO) = 0
                 AND GROUPING (PROJECT_CD) = 1
                 AND GROUPING (BUSI) = 1
            THEN
               '합계'
            WHEN     GROUPING (NO) = 1
                 AND GROUPING (PROJECT_CD) = 1
                 AND GROUPING (BUSI) = 1
            THEN
               '형태별합계'
            ELSE
               NO
         END
            NO
        ,PROJECT_CD
        ,CASE
            WHEN     GROUPING (NO) = 0
                 AND GROUPING (BUSI) = 0
                 AND GROUPING (PROJECT_CD) = 1
            THEN
               TO_CHAR (COUNT (*))
            WHEN     GROUPING (NO) = 0
                 AND GROUPING (BUSI) = 1
                 AND GROUPING (PROJECT_CD) = 1
            THEN
               TO_CHAR (COUNT (*))
            WHEN     GROUPING (NO) = 1
                 AND GROUPING (BUSI) = 1
                 AND GROUPING (PROJECT_CD) = 1
            THEN
               TO_CHAR (COUNT (*))
            ELSE
               MAX (PROJECT_NM)
         END
            AS NM
        ,BUSI
    FROM T
GROUP BY ROLLUP (NO, BUSI, PROJECT_CD)

형태 SHAPE

도움 부탁 드려요 ㅜㅜ

by 마농 [2018.11.12 12:44:57]

제시하신 쿼리 실행해보니 위의 결과처럼 나오지 않구요?
아래 결과처럼 나와야 하는 기준도 제시되어 있지 않네요?
결과나 쿼리의 값들도 서로 일치하지 않고 왔다갔다 하는 것 같구요?


by 초봉 [2018.11.12 13:43:36]

죄송합니다 마농님 쿼리를 짜던중에 이리저리하던걸 기입했네요 ㅜㅜ

수정은 했습니다만.. 지금 대충 기준은 나왔는데 SHAPE 널인것은 카운트 안하고 값이 들어가있는 경우에만 나오게 하고 싶습니다. 


by 마농 [2018.11.12 14:04:18]

원본(with 문의 자료)과 결과집합, 그리고 그에 대한 설명.
이 3가지가 서로 다르거나 부족합니다(뒤죽박죽). 3위 일체 시켜주세요.
대충이라는 표현 쓰지 마시고...정확하게 3위 일체 시켜주세요.


by 신이만든지기 [2018.11.12 14:18:13]

저도 한번 읽어보고 소스(with 절)를 실행시켜 봤는데, 질문자님이 대체 무엇을 원하시는 지 모르겠네요.

정확하고 구체적인 설명이 필요합니다.

 

 


by 봉 [2018.11.12 14:26:10]

마지막 로우에 합계를 넣는데 굳이 한방쿼리를 고집할 필요가 있을까요?

그냥 union으로 마지막 합계로우만 따로 추가하면 편하게 했을텐데요

원하는 표의 결과값은 아래 count절만 바꾸면 나오긴 하네요

 ,CASE
            WHEN     GROUPING (NO) = 0
                 AND GROUPING (BUSI) = 0
                 AND GROUPING (PROJECT_CD) = 1
            THEN
               TO_CHAR (COUNT (*))
            WHEN     GROUPING (NO) = 0
                 AND GROUPING (BUSI) = 1
                 AND GROUPING (PROJECT_CD) = 1
            THEN
               TO_CHAR (COUNT (*))
            WHEN     GROUPING (NO) = 1
                 AND GROUPING (BUSI) = 1
                 AND GROUPING (PROJECT_CD) = 1
            THEN
               TO_CHAR (COUNT (*)) --> TO_CHAR (COUNT (SHAPE))
            ELSE
               MAX (PROJECT_NM)
         END
            AS NM


by 마농 [2018.11.12 14:45:45]
WITH T AS
(
SELECT 'A001' no, 'NP0001' project_cd, 'Q0001' shape, 1 busi, '수행1' project_nm FROM dual
UNION ALL SELECT 'A001', 'NP0002', 'Q0001', null, '수행2' FROM dual
UNION ALL SELECT 'A001', 'NP0003', ''     ,    1, '수행3' FROM dual
UNION ALL SELECT 'A001', 'NP0004', 'Q0001', null, '수행4' FROM dual
)
SELECT DECODE(GROUPING_ID(no, busi, project_cd), 0, no
                                               , 1, '과제건수'
                                               , 3, '합계'
                                               , 7, '형태별합계'
                                               ) no
     , busi
     , project_cd
     , DECODE(GROUPING_ID(no, busi, project_cd), 0, project_nm
                                               , 7, COUNT(shape)
                                                  , COUNT(*)
                                               ) project_nm
  FROM t a
 GROUP BY ROLLUP(no, busi, (project_cd, project_nm))
 ORDER BY a.no, a.busi, a.project_cd
;

 

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