GROUP BY B, A와 GROUP BY COALESCE (B, A)의 차이점


20

나는 매우 혼란스러워졌다.

어떤 상황에서 GROUP BY COALESCE를 사용하고 싶은 사람이 있습니까?

내 생각에 조건부 데이터 집합을 열 B (B가 null이 아닌 경우)로, 그렇지 않으면 열 A로 조건부로 그룹화하려는 경우 사용합니다. 그 소리가 맞습니까?

답변:


37

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이 원하는 것입니다.


Chris Date : "널을 포함하는 '유형'은 유형이 아닙니다 (유형에 값이 포함되어 있기 때문에). 널을 포함하는 '튜플'은 튜플이 아닙니다 (튜플에 값이 포함되어 있기 때문에).
언젠가

@onedaywhen : 글쎄, 그것은 이론과 실제의 차이점이다;)
a_horse_with_no_name

내 요점 : 그것은 관계의 튜플과 SQL 테이블 표현식의 행의 차이점입니다. 튜플은 이론적으로나 실제로 SQL에도 적용되지 않습니다.
onedaywhen

@onedaywhen : 그래서 내 말을 바꿔야한다는 뜻입니까? 그렇다면 SQL에서 두 개의 열 값의 조합을 표현할 것을 권장하는 단어는 무엇입니까? 반드시 같은 테이블에 있거나 전체 행일 필요는 없습니다.
a_horse_with_no_name

1
예를 들어, 자습서 D 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 }.
onedaywhen

16

다음은 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

2
좋은 데모!
a_horse_with_no_name

'수준'에 대해 생각하기 위해 반사를 가져와야합니다. 매우 유용합니다!
Luc M
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.