여러 열이 있는 오라클 롤업 함수
간단한 질문이 있습니다.
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
롤업 및 관련 항목에 대한 자세한 정보:롤업과 큐브에 관한 팀 홀
(편집)
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
'programing' 카테고리의 다른 글
윈도우 엣지와 관련하여 팝오버의 X 위치를 기준으로 부트스트랩 팝오버의 위치를 변경? (0) | 2023.09.14 |
---|---|
Swift #selector 구문으로 컴파일 오류의 "모호한 사용"을 해결하려면 어떻게 해야 합니까? (0) | 2023.09.14 |
마이크로소프트.ACE.OLEDB.12.0' 공급자가 로컬 시스템(서버)에 등록되어 있지 않습니다. (0) | 2023.09.14 |
신호 처리기에서 OCaml로 래핑된 ZeroMQ 코드 호출 (0) | 2023.09.09 |
mysql 구성이 "서버 시작"에서 중지됨 (0) | 2023.09.09 |