답변:
로 GROUP BY b,a튜플 (null, 1), (1,1), (2,1)그리고 (17,1)네 가지 그룹으로 끝날 것이다.
로 GROUP BY coalesce(b,a)튜플 (null,1), (1,1), (2,1)와 (17,1)같은 그룹에 끝날 것입니다.
"조건부"그룹화를 원하면 예를 들어, 버전 coalesce이 원하는 것입니다.
TUPLE { a 17 , b 1 }에서와 동일 TUPLE { b 1 , a 17 }하지만 SQL에서 행 값 생성자 (17, 1)는 행 값 생성자 와 동일하지 않습니다 (1, 17). 이것이 "페어"가 튜플이 아닌 이유입니다. 당신은 내가해야 행의 형태 생성자를 생략했기 때문에 가정 문맥을들이는 (a, b)것이 아니라 (b, a)그러나 그것의 포함은 여전히 튜플하지 것이다. 반대로, TUPLE { 17 , 1 }Tutorial D에서 유효한 튜플 호출이 아니거나 아닙니다 TUPLE { a null , b 1 }.
다음은 a_horse_with_no_name의 탁월한 +1 답변을 보여줍니다 .
SQL> WITH Data AS (
2 SELECT level, DECODE(Level,3,NULL,1) A
3 , DECODE(level,2,NULL,4,2,1) B
4 FROM dual connect by level <=5
5 )
6 SELECT A, B, count(*) FROM Data GROUP BY B, A;
A B COUNT(*)
- - ----------
1 1 2
1 1
1 2 1
1 1
SQL> WITH Data AS (
2 SELECT level, DECODE(Level,3,NULL,1) A
3 , DECODE(level,2,NULL,4,2,1) B
4 FROM dual connect by level <=5
5 )
6 SELECT COALESCE(B, A) X, count(*) FROM Data GROUP BY COALESCE(B, A);
X COUNT(*)
- ----------
1 4
2 1