Diferença entre GRUPO POR B, A e GRUPO POR CARVÃO (B, A)

20

Estou ficando muito confuso.

Alguém poderia explicar gentilmente sob quais circunstâncias eu gostaria de usar um GRUPO POR COALESCE?

Meu palpite é que eu o usaria se quisesse agrupar condicionalmente um conjunto de dados pela coluna B (se B não fosse nulo) e pela coluna A caso contrário. Isso soa certo?

Mark McLaren
fonte

Respostas:

37

Com GROUP BY b,aas tuplas (null, 1), (1,1), (2,1)e (17,1)iria acabar em quatro grupos diferentes.

Com GROUP BY coalesce(b,a)as tuplas (null,1), (1,1), (2,1)e (17,1)acabaria no mesmo grupo.

Se você deseja o agrupamento "condicional", sim, a versão com coalesceprovavelmente é o que você deseja.

um cavalo sem nome
fonte
Chris Date : "Um 'tipo' que contém um nulo não é um tipo (porque os tipos contêm valores). Uma 'tupla' que contém um nulo não é uma tupla (porque as tuplas contêm valores)."
onedaywhen
@onedaywhen: bem, essa é a diferença entre teoria e prática;)
a_horse_with_no_name
O que quero dizer: essa é a diferença entre uma tupla em uma relação e uma linha em uma expressão de tabela SQL. Uma tupla não se aplica ao SQL, tanto na teoria quanto na prática.
onedaywhen
@ onedaywhen: então você quer dizer que eu deveria mudar minha redação? Qual palavra você recomendaria para expressar a combinação de dois valores (coluna) no SQL? Eles não precisam necessariamente ser da mesma tabela nem ser uma linha completa.
A_horse_with_no_name
11
Por exemplo, no Tutorial D, TUPLE { a 17 , b 1 }é o mesmo que TUPLE { b 1 , a 17 }, mas no SQL o construtor de valor da linha (17, 1)não é o mesmo que o construtor de valor da linha (1, 17). É por isso que seus "pares" não são tuplas. Porque você ter omitido um construtor tipo de linha que deve assumir a partir do contexto são (a, b), em vez de (b, a), mas a sua inclusão ainda não torná-lo uma tupla. Por outro lado, TUPLE { 17 , 1 }não é uma chamada de tupla válida no Tutorial D, nem é TUPLE { a null , b 1 }.
onedaywhen
16

Aqui está uma demonstração da excelente resposta +1 de a_horse_with_no_name .

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
Leigh Riffel
fonte
2
Boa demonstração!
a_horse_with_no_name
Eu tenho que pegar o reflexo para pensar em 'level', é muito útil!
precisa