Différence entre GROUP BY B, A et GROUP BY COALESCE (B, A)

20

Je suis devenu très confus.

Quelqu'un pourrait-il bien vouloir expliquer dans quelles circonstances je voudrais utiliser un GROUPE PAR COALESCE?

Je suppose que je l'utiliserais si je voulais grouper conditionnellement un ensemble de données par la colonne B (si B n'était pas nul) et par la colonne A sinon. Est-ce que ça sonne bien?

Mark McLaren
la source

Réponses:

37

Avec GROUP BY b,ales tuples (null, 1), (1,1), (2,1)et (17,1)se terminerait en quatre groupes différents.

Avec GROUP BY coalesce(b,a)les tuples (null,1), (1,1), (2,1)et (17,1)finirait dans le même groupe.

Si vous voulez le regroupement "conditionnel", alors oui, la version avec coalesceest probablement ce que vous voulez.

un cheval sans nom
la source
Chris Date : "Un 'type' qui contient un null n'est pas un type (car les types contiennent des valeurs). Un 'tuple' qui contient un null n'est pas un tuple (parce que les tuples contiennent des valeurs)."
onedaywhen
@onedaywhen: eh bien, c'est la différence entre la théorie et la pratique;)
a_horse_with_no_name
Mon point: c'est la différence entre un tuple dans une relation et une ligne dans une expression de table SQL. Un tuple ne s'applique pas à SQL, à la fois en théorie et en pratique.
onedaywhen
@onedaywhen: vous voulez donc dire que je devrais changer ma formulation? Quel mot recommanderiez-vous pour exprimer une combinaison de deux valeurs (colonnes) en SQL? Ils ne doivent pas nécessairement provenir de la même table ni être une ligne complète.
a_horse_with_no_name
1
Par exemple, dans le didacticiel D, TUPLE { a 17 , b 1 }est identique à TUPLE { b 1 , a 17 }, mais en SQL, le constructeur de valeur de ligne (17, 1)n'est pas le même que le constructeur de valeur de ligne (1, 17). C'est pourquoi vos "paires" ne sont pas des tuples. Parce que vous avez omis un constructeur de type de ligne , je dois prendre du contexte dans lequel ils sont (a, b)plutôt que (b, a)mais son inclusion ne seraient toujours pas en faire un tuple. En revanche, ce TUPLE { 17 , 1 }n'est pas une invocation de tuple valide dans le didacticiel D, non plus TUPLE { a null , b 1 }.
quand
16

Voici une démonstration de l'excellente réponse +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
la source
2
Belle démonstration!
a_horse_with_no_name
Je dois avoir le réflexe de penser au «niveau», c'est très utile!
Luc M