2009-05-20 8 views
4

Je suis en train de faire un calcul assez compliqué SELECT que je généralise:colonne calculée à partir de deux colonnes Calculée

  1. requête principale est un caractère générique pour sélectionner une table
  2. Un sous-requête fait un COUNT() de tous les éléments basés sur une condition (cela fonctionne bien)
  3. Une autre sous-requête fait un SUM() de nombres dans une colonne basée sur une autre condition. Cela fonctionne également correctement, sauf si aucun enregistrement ne remplit les conditions, il renvoie 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 (ie, (subquery1) AS count1, (subquery2) AS count2, count1+count2 AS total) mais je ne pense pas qu'il soit possible de calculer deux colonnes calculées, et même si c'était, je me sens comme le le même problème s'applique.

Est-ce que quelqu'un a une solution élégante à ce problème en dehors de simplement obtenir les deux valeurs de sous-requête et en les totalisant dans mon programme?

Merci!

+0

Pouvez-vous fournir des détails? Comme un exemple de requête que vous avez créé. –

+0

Rappelez-vous aussi le COALESCE (SUM (CASE WHEN condition THEN 1 ELSE 0 END), 0) astuce pour compter conditionnellement éléments: vous pourriez être en mesure de combiner à deux sous-requêtes en un seul, ou les rouler dans la requête principale. – araqnid

Répondre

11

Deux questions se passe ici:

  • Vous ne pouvez pas utiliser un alias de colonne dans une autre expression dans la même liste SELECT. Toutefois, 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 effectuer d'opérations arithmétiques avec NULL, car NULL n'est pas zéro. Toutefois, vous pouvez "NULL" par défaut à une valeur non NULL à l'aide de la fonction COALESCE(). Cette fonction renvoie 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 qu'une table dérivée doit être donné un alias de table, "t" dans cet exemple)

+0

FANTASTIQUE, merci. Je n'ai pas pensé à faire COALESCE (sous-requête, 0). C'est un truc génial. – Jason

+0

Vous pouvez également mettre le COALESCE() dans chaque sous-requête, en enveloppant le SUM() ou COUNT(). Six d'une et demi-douzaine de l'autre. –

1

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 null pour toute instance de cette colonne étant zéro.

3

Tout d'abord, la fonction COALESCE devrait vous aider à résoudre tous les problèmes nuls. Pourriez-vous utiliser une union pour fusionner ces deux requêtes dans un ensemble de résultats unique, puis la traiter comme sous-requête pour une analyse plus approfondie? Ou peut-être que je n'ai pas complètement compris votre question?

+0

Je ne suis pas familier avec UNION ou COALESCE, bien que je les ai vus avant ... je pense que vous comprenez correctement, car j'essaye de les fusionner dans un ensemble de résultats unique. puis-je faire ((subquery1) + COALESCE (subquery2))? ... ou ce que – Jason

+0

génial ... COALESCE a fait l'affaire, bien que la chaîne SQL soit assez longue et lourde car je dois répéter la sous-requête SUM() deux fois (maintenant 3 sous-requêtes en une seule colonne, oy) est-il possible de le faire sans répéter une sous-requête entière? – Jason

+0

COALESCE (subquery2, 0) - signifie la valeur de subquery2, ou 0 si c'est null. – araqnid

0

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

Qui sait quand la fonction COALESCE est déconseillée ou si un autre SGBD le supporte ou non.

Questions connexes