Unterschied zwischen GROUP BY B, A und GROUP BY COALESCE (B, A)

20

Ich habe mich sehr verwirrt.

Könnte jemand freundlich erklären, unter welchen Umständen ich eine GROUP BY COALESCE verwenden möchte?

Ich vermute, dass ich es verwenden würde, wenn ich einen Datensatz nach Spalte B (wenn B nicht null war) und nach Spalte A ansonsten bedingt gruppieren wollte. Klingt das richtig?

Mark McLaren
quelle

Antworten:

37

Mit GROUP BY b,aden Tupeln (null, 1), (1,1), (2,1)und (17,1)würde in vier verschiedenen Gruppen enden.

Mit GROUP BY coalesce(b,a)den Tupeln (null,1), (1,1), (2,1)und (17,1)würde bis in der gleichen Gruppe beenden.

Wenn Sie die "bedingte" Gruppierung wollen, dann ist ja die Version mit coalescewahrscheinlich was Sie wollen.

ein Pferd ohne Name
quelle
Chris Date : "Ein 'Typ', der eine Null enthält, ist kein Typ (weil Typen Werte enthalten). Ein 'Tupel', das eine Null enthält, ist kein Tupel (weil Tupel Werte enthalten)."
am
@onedaywhen: na ja, das ist der Unterschied zwischen Theorie und Praxis;)
a_horse_with_no_name
Mein Punkt: Das ist der Unterschied zwischen einem Tupel in einer Relation und einer Zeile in einem SQL-Tabellenausdruck. Ein Tupel gilt theoretisch und praktisch nicht für SQL.
am
@onedaywhen: Also soll ich meine Formulierung ändern? Welches Wort würden Sie empfehlen, um die Kombination von zwei (Spalten-) Werten in SQL auszudrücken? Sie müssen nicht unbedingt aus derselben Tabelle stammen oder eine vollständige Zeile sein.
a_horse_with_no_name 15.12.11
1
Beispiel: In Tutorial D TUPLE { a 17 , b 1 }ist dies dasselbe wie TUPLE { b 1 , a 17 }in SQL, aber der Zeilenwertkonstruktor (17, 1)ist nicht derselbe wie der Zeilenwertkonstruktor (1, 17). Aus diesem Grund sind Ihre "Paare" keine Tupel. Da Sie eine Reihe Typkonstruktor weggelassen habe ich muss annehmen , aus dem Kontext sind sie (a, b)nicht , (b, a)aber ihre Aufnahme wäre es immer noch nicht ein Tupel machen. Im Gegensatz dazu TUPLE { 17 , 1 }ist in Tutorial D weder ein gültiger Tupelaufruf noch ein gültiger Tupelaufruf TUPLE { a null , b 1 }.
am
16

Hier ist eine Demonstration der ausgezeichneten +1 Antwort von 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
quelle
2
Schöne Demonstration!
a_horse_with_no_name
Ich muss den Reflex bekommen, über "Level" nachzudenken, es ist sehr nützlich!
Luc M