Oracle 23ai(23.9)부터 GROUP BY ALL 절을 사용할 수 있습니다. GROUP BY ALL 절을 사용하면 집계 함수를 사용하지 않은 표현식을 기준으로 결과가 그룹핑됩니다.
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1, c2) AS SELECT CEIL (ROWNUM / 100), CEIL (ROWNUM / 10) FROM XMLTABLE ('1 to 1000');
아래는 GROUP BY ALL 절을 사용한 예제입니다. 집계 함수를 사용하지 않은 표현식을 기준으로 결과가 그룹핑되는 것을 볼 수 있습니다.
-- 2-1
SELECT COUNT (*) AS cnt FROM t1 GROUP BY ALL;
CNT
----
1000
1 row selected.
-- 2-2
SELECT c1, COUNT (*) AS cnt FROM t1 GROUP BY ALL;
C1 CNT
-- ---
1 100
...
10 100
10 rows selected.
-- 2-3
SELECT c1, c2, COUNT (*) AS cnt FROM t1 GROUP BY ALL;
C1 C2 CNT
-- --- ---
1 1 10
...
10 100 10
100 rows selected.
아래 결과에서 GROUP BY ALL 절이 Query Transformation에 의해 처리되지 않음을 유추할 수 있습니다.
-- 3-1
SET SERVEROUT ON
DECLARE
v_output_sql_text CLOB;
BEGIN
DBMS_UTILITY.EXPAND_SQL_TEXT (
input_sql_text => 'SELECT c1, c2, COUNT (*) AS cnt FROM t1 GROUP BY ALL'
, output_sql_text => v_output_sql_text
);
DBMS_OUTPUT.PUT_LINE (v_output_sql_text);
END;
/
SELECT "A1"."C1" "C1","A1"."C2" "C2",COUNT(*) "CNT" FROM "C##TUNA"."T1" "A1" GROUP BY "A1"."C1","A1"."C2"
-- 3-2: 10053 trace
Query after VW_MRG2:
qb SEL$1 (#0):******* UNPARSED QUERY IS *******
SELECT "T1"."C1" "C1","T1"."C2" "C2",COUNT(*) "CNT" FROM "C##TUNA"."T1" "T1" GROUP BY "T1"."C1","T1"."C2"