web-dev-qa-db-fra.com

Comment faire countIf () dans Oracle

Comment sélectionner une variable qui donne une sortie identique à la fonction Excel:

COUNTIFS(A1:D1,"<25", A1:D1, ">16")?

C'est à dire. compter le nombre de fois où les valeurs dans mes quatre champs sont comprises entre 16 et 25.

5
amsbam1

Vous pouvez le faire avec les expressions count() et case. Remarque: case a une clause else facultative; s'il n'est pas utilisé, la valeur par défaut else "valeur" est null. Count ne compte que des valeurs non NULL, vous pouvez donc combiner ces observations pour écrire du code compact. Ce qui est compté n'a pas d'importance. ainsi, l'expression case peut renvoyer un nombre (1 est habituel, mais 0 est tout aussi valide et donnera le même résultat, car les valeurs sont COUNTED, et non SUMMED) - mais vous pouvez aussi avoir une chaîne comme 'x' ou une date dans l'expression de cas. Juste pour illustrer cela, je vais utiliser une chaîne.

select count( case when col > 16 and col < 25 then 'x' end ) as ct from your_table;

Ici your_table est le nom de votre table, col est le nom de la colonne contenant les valeurs, et ct est le nom de la colonne résultante (le libellé du nombre de valeurs satisfaisant votre condition).

Bien sûr, dans une base de données, vous pouvez obtenir plus facilement le même résultat:

select count(*) as ct from your_table where col > 16 and col < 25;

Notez cependant que les valeurs sont dans une colonne.

Si vous avez plutôt une table avec quatre colonnes et plusieurs lignes, si toutes les valeurs de toutes les colonnes sont des nombres et si vous souhaitez ajouter une colonne indiquant le nombre de valeurs strictement comprises entre 16 et 25 DANS CHAQUE ROW, la solution est différente (mais il utilise les mêmes idées):

select col1, col2, col3, col4, 
       case when col1 > 16 and col1 < 25 then 1 else 0 end +
       case when col2 > 16 and col2 < 25 then 1 else 0 end +
       case when col3 > 16 and col3 < 25 then 1 else 0 end +
       case when col4 > 16 and col4 < 25 then 1 else 0 end    as ct
from   my_table;
4
mathguy

Vous feriez cela dans une requête SQL en utilisant case:

select sum(case when col between 16 and 25 then 1 else 0 end)
from t;

Notez que between est inclusif dans SQL, pas exclusif, donc basé sur votre logique de code:

select sum(case when col > 16 and col < 25 then 1 else 0 end)
from t;
3
Gordon Linoff