Diferencia entre GROUP BY B, A y GROUP BY COALESCE (B, A)


20

Me he estado confundiendo mucho.

¿Alguien podría explicar amablemente en qué circunstancias me gustaría utilizar un GROUP BY COALESCE?

Supongo que lo usaría si quisiera agrupar condicionalmente un conjunto de datos por la columna B (si B no fuera nulo) y por la columna A de lo contrario. ¿Eso suena bien?

Respuestas:


37

Con GROUP BY b,alas tuplas (null, 1), (1,1), (2,1)y (17,1)terminaría en cuatro grupos diferentes.

Con GROUP BY coalesce(b,a)las tuplas (null,1), (1,1), (2,1)y (17,1)terminaría en el mismo grupo.

Si desea la agrupación "condicional", entonces sí, la versión con coalescees probablemente lo que desea.


Chris Date : "Un 'tipo' que contiene un nulo no es un tipo (porque los tipos contienen valores). Una 'tupla' que contiene un nulo no es una tupla (porque las tuplas contienen valores)".
cuando el

@onedaywhen: bueno, esa es la diferencia entre teoría y práctica;)
a_horse_with_no_name

Mi punto: esa es la diferencia entre una tupla en una relación y una fila en una expresión de tabla SQL. Una tupla no se aplica a SQL, tanto en teoría como en la práctica.
cuando el

@onedaywhen: ¿quieres decir que debería cambiar mi redacción? ¿Qué palabra recomendaría para expresar la combinación de dos valores (columna) en SQL? No necesariamente deben ser de la misma tabla ni ser una fila completa.
a_horse_with_no_name

1
Por ejemplo, en el Tutorial D, TUPLE { a 17 , b 1 }es igual que TUPLE { b 1 , a 17 }, pero en SQL el constructor del valor de la fila (17, 1)no es el mismo que el constructor del valor de la fila (1, 17). Es por eso que sus "pares" no son tuplas. Debido a que ha omitido un constructor de tipo de fila, debo suponer por el contexto que son en (a, b)lugar de hacerlo, (b, a)pero su inclusión aún no lo convertiría en una tupla. Por el contrario, TUPLE { 17 , 1 }no es una invocación de tupla válida en el Tutorial D, ni lo es TUPLE { a null , b 1 }.
cuando el

16

Aquí hay una demostración de la excelente respuesta +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
Buena demostración!
a_horse_with_no_name

Tengo que tener el reflejo de pensar en 'nivel', ¡es muy útil!
Luc M
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.