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.