Differenza tra GROUP BY B, A e GROUP BY COALESCE (B, A)


20

Mi sto confondendo molto.

Qualcuno potrebbe gentilmente spiegare in quali circostanze vorrei utilizzare un GROUP BY COALESCE?

La mia ipotesi è che lo userei se volessi raggruppare condizionalmente un insieme di dati per colonna B (se B non fosse nullo) e per colonna A in caso contrario. Suona bene?

Risposte:


37

Con GROUP BY b,ale tuple (null, 1), (1,1), (2,1)e (17,1)finirebbe in quattro gruppi differenti.

Con GROUP BY coalesce(b,a)le tuple (null,1), (1,1), (2,1)e (17,1)finirebbe nello stesso gruppo.

Se vuoi il raggruppamento "condizionale", allora sì, coalesceprobabilmente la versione con è quella che desideri.


Chris Date : "Un 'tipo' che contiene un null non è un tipo (perché i tipi contengono valori). Una 'tupla' che contiene un null non è una tupla (perché le tuple contengono valori)."
Onedayquen

@onedaywhen: beh, questa è la differenza tra teoria e pratica;)
a_horse_with_no_name

Il mio punto: questa è la differenza tra una tupla in una relazione e una riga in un'espressione di tabella SQL. Una tupla non si applica a SQL, sia in teoria che in pratica.
Onedayquen

@onedaywhen: quindi vuoi dire che dovrei cambiare la mia formulazione? Quale parola consiglieresti di esprimere la combinazione di due valori (colonna) in SQL allora? Non devono necessariamente appartenere alla stessa tabella né essere una riga completa.
a_horse_with_no_name il

1
Ad esempio, nell'esercitazione D, TUPLE { a 17 , b 1 }è uguale a TUPLE { b 1 , a 17 }, ma in SQL il costruttore del valore di riga (17, 1)non è lo stesso del costruttore del valore di riga (1, 17). Ecco perché le tue "coppie" non sono tuple. Poiché hai omesso un costruttore del tipo di riga, devo supporre dal contesto che sono (a, b)piuttosto che, (b, a)ma la sua inclusione non lo renderebbe ancora una tupla. Al contrario, TUPLE { 17 , 1 }non è una valida invocazione di tuple nel Tutorial D, né lo è TUPLE { a null , b 1 }.
onedayquen

16

Ecco una dimostrazione dell'eccellente risposta +1 di 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
Bella dimostrazione!
a_horse_with_no_name

Devo convincere il riflesso a pensare al "livello", è molto utile!
Luc M
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.