programing

여러 열이 있는 오라클 롤업 함수

instargram 2023. 9. 14. 21:37
반응형

여러 열이 있는 오라클 롤업 함수

간단한 질문이 있습니다.

WITH data(val1, val2, val3) AS
     ( SELECT 'a' ,'a-details' ,'1' FROM DUAL
     UNION ALL
     SELECT 'b' ,'b-details' ,'2' FROM DUAL
     UNION ALL
     SELECT 'c' ,'c-details' ,'3' FROM DUAL
     )
SELECT NVL(val1,'Total Result'),
     val2,
     SUM(val3) tot
from data
group by rollup(val1, val2);

출력은 다음과 같습니다.

VAL1                             VAL2                                    TOT
-------------------------------- -------------------------------- ----------
a                                a-details                                 1 
a                                                                          1 
b                                b-details                                 2 
b                                                                          2 
c                                c-details                                 3 
c                                                                          3 
Total Result                                                               6 

하지만 다음과 같은 출력이 필요합니다.

VAL1                             VAL2                                    TOT
-------------------------------- -------------------------------- ----------
a                                a-details                                 1 
b                                b-details                                 2 
c                                c-details                                 3 
Total Result                                                               6 

미리 감사드립니다.

GROUPING SET 절로 필요한 정확한 세트를 지정하는 것이 오히려 더 쉽다고 생각합니다.

WITH data(val1, val2, val3) AS
     ( SELECT 'a' ,'a-details' ,'1' FROM DUAL
     UNION ALL
     SELECT 'b' ,'b-details' ,'2' FROM DUAL
     UNION ALL
     SELECT 'c' ,'c-details' ,'3' FROM DUAL
     )
SELECT NVL(val1,'Total Result'),
     val2,
     SUM(val3) tot
from data
group by grouping sets ((val1, val2),());

계산할 수준을 직접적으로 지정하기 때문에 더 효율적이라고 생각합니다.

http://sqlfiddle.com/ #!4/8301d/3

큐브(CUBE) 및 롤업(ROLLUP)은 많은 수의 집성 레벨을 자동으로 생성하는 데 유용합니다(예:차원 계층)의 모든 레벨을 사용할 수 있으며, 대형 큐브 생성 집합에서 레벨의 작은 부분 집합을 제거하고자 할 경우 GROUPING ID를 사용할 수 있지만 GROUPING SET은 특정 집계 레벨을 지정하기 위해 정확하게 설계되었습니다.

GROUPING_ID 식

사용할 수 있습니다.GROUPING_ID필요한 하위 합계 수준을 필터링하는 식:

WITH data AS
     ( SELECT 'a' AS val1 ,'a-details' AS val2 , '1' AS val3 FROM DUAL
     UNION ALL
     SELECT 'b' ,'b-details' ,'2' FROM DUAL
     UNION ALL
     SELECT 'c' ,'c-details' ,'3' FROM DUAL
     )
SELECT NVL(val1,'Total Result'),
     val2,
     SUM(val3) tot
from data
group by ROLLUP(val1, val2)
HAVING GROUPING_ID(val1, val2) IN (0, 3);

출력:

NVL(VAL1, '총 결과') VAL2 TOT----------------------- --------- ----------a-take 1b b-b-slot 2c-c-cs3총 결과 6

GROUPING_ID하위 합계가 없는 행의 경우 0을 반환하고, 첫 번째 레벨의 경우 1을 반환하는 등 반환되는 값을 확인할 수 있습니다.

WITH data AS
     ( SELECT 'a' AS val1 ,'a-details' AS val2 , '1' AS val3 FROM DUAL
     UNION ALL
     SELECT 'b' ,'b-details' ,'2' FROM DUAL
     UNION ALL
     SELECT 'c' ,'c-details' ,'3' FROM DUAL
     )
SELECT NVL(val1,'Total Result'),
     val2,
     SUM(val3) tot,
     GROUPING_ID(val1, val2) AS grp_id
from data
group by ROLLUP(val1, val2);
NVL(VAL1, '총 결과') VAL2 TOT GRP_ID----------------------- --------- ---------- ----------초대형 10호기.11.b b-b-slot 20b 21c-c-cs30c 31총 결과 6 3

SQLFidle에서 확인

롤업 및 관련 항목에 대한 자세한 정보:롤업과 큐브에 관한 팀 홀

(편집)

GROUP(GROUP Function)

댓글에 대해서.사용할 수 있습니다.GROUPING함수:

GROUPING - 단일 열을 매개 변수로 허용하고 열에 부분 합계의 일부로 생성된 null 값이 포함된 경우 "1"을 반환합니다.ROLLUP아니면CUBE저장된 null 값을 포함한 다른 값에 대해 operation 또는 "0"을 선택합니다.

반환된 값의 예:

WITH data AS
     ( SELECT 'a' AS val1 ,'a-details' AS val2 , '1' AS val3 FROM DUAL
     UNION ALL
     SELECT 'b' ,'b-details' ,'2' FROM DUAL
     UNION ALL
     SELECT 'c' ,'c-details' ,'3' FROM DUAL
     )
SELECT NVL(val1,'Total Result'),
     val2,
     SUM(val3) tot,
     grouping(val1),
     grouping(val2)
from data
group by ROLLUP(val1, val2);

출력:

NVL(VAL1, '총 결과') VAL2 토트 그룹화(VAL1) 그룹화(VAL2)----------------------- --------- ---------- -------------- --------------백 불짜리 백 불짜리 백 불짜리 백 불짜리 백 불짜리A101b b-b-slot 200b 2001년c-c-cs300c 30 1총 결과 6 1 1

따라서 쿼리는 다음과 같이 표시됩니다.

WITH data AS
     ( SELECT 'a' AS val1 ,'a-details' AS val2 , '1' AS val3 FROM DUAL
     UNION ALL
     SELECT 'b' ,'b-details' ,'2' FROM DUAL
     UNION ALL
     SELECT 'c' ,'c-details' ,'3' FROM DUAL
     )
SELECT NVL(val1,'Total Result'),
     val2,
     SUM(val3) tot
from data
group by ROLLUP(val1, val2)
HAVING GROUPING(val1) = 1
   OR (GROUPING(val1) + GROUPING(val2) = 0);

출력:

NVL(VAL1, '총 결과') VAL2 TOT----------------------- --------- ----------a-take 1b b-b-slot 2c-c-cs3총 결과 6

를 .GROUPING여기서 'AskTom'의 기능입니다.

언급URL : https://stackoverflow.com/questions/20068015/oracle-rollup-function-with-multiple-columns

반응형