Question

Je suis en train de faire un calcul de SELECT assez compliqué que je vais généraliser:

  1. requête principale est un joker pour sélectionner une table
  2. Un sous-requête fait un COUNT() de tous les éléments sur la base d'une condition (ceci fonctionne très bien)
  3. Une autre sous-requête fait un SUM() de chiffres dans une colonne basée sur une autre condition. Cela fonctionne aussi correctement, sauf si aucun enregistrement remplissent les conditions, il retourne NULL.

Je voulais d'abord ajouter les deux sous-requêtes, quelque chose comme (subquery1)+(subquery2) AS total qui fonctionne très bien, sauf subquery2 est nul, auquel cas total devient nulle, peu importe ce qui est le résultat de subquery1. Ma deuxième pensée était d'essayer de créer une troisième colonne qui devait être un calcul des deux sous-requêtes (c.-à-(subquery1) AS count1, (subquery2) AS count2, count1+count2 AS total) mais je ne pense pas qu'il est possible de calculer deux colonnes calculées, et même si elle était, je me sens comme le applique le même problème.

Quelqu'un at-il une solution élégante à ce problème en dehors de tout obtenir les deux valeurs et les sous-requêtes totalisant dans mon programme?

Merci!

Était-ce utile?

La solution

Deux questions vont ici:

  • Vous ne pouvez pas utiliser un alias de colonne dans une autre expression dans la même liste SELECT.

    Cependant, vous pouvez établir des alias dans une sous-requête de table dérivée et les utiliser dans une requête externe.

  • Vous ne pouvez pas faire de l'arithmétique avec NULL, parce que NULL est zéro .

    Cependant, vous pouvez « par défaut » NULL à une valeur non NULL en utilisant la fonction COALESCE(). Cette fonction retourne son premier argument non NULL.

Voici un exemple:

SELECT *, count1+count2 AS total
FROM (SELECT *, COALESCE((subquery1), 0) AS count1, 
                COALESCE((subquery2), 0) AS count2 
      FROM ... ) t;

(rappelez-vous que dans cet exemple table dérivée doit être donné un alias de table, "t")

Autres conseils

Tout d'abord, la fonction COALESCE devrait vous aider à prendre soin des problèmes null.

Pourriez-vous utiliser un syndicat pour fusionner ces deux requêtes en un seul jeu de résultats, puis le traiter comme une sous-requête pour une analyse ultérieure?

Ou peut-être que je ne comprends pas tout à fait votre question?

Je voudrais essayer (pour la deuxième requête) quelque chose comme: SELECT SUM (ISNULL (mycolumn, 0)) // S'il vous plaît vérifier la syntaxe de cette avant de l'utiliser, mais ...

Cela devrait retourner 0 au lieu de zéro pour chaque instance de cette colonne étant égale à zéro.

Il est peut-être inutile de dire, mais puisque vous l'utilisez dans un programme, vous préférez utiliser la logique de programme pour additionner les deux résultats (NULL et un certain nombre), en raison de problèmes de portabilité.

Qui sait quand la fonction COALESCE est dépréciée ou si un autre SGBD prend en charge ou non.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top