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?

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.


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

2
Boa demonstração!
a_horse_with_no_name

Eu tenho que pegar o reflexo para pensar em 'level', é muito útil!
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.