J'ai une table avec deux colonnes qui pourraient être null
(ainsi que d'autres colonnes). Je voudrais compter combien de lignes qui ont la colonne a, b, les deux et aucune des colonnes définies sur null.
Est-ce possible avec Oracle en une requête? Ou devrais-je créer une requête pour chacun? Vous ne pouvez pas utiliser group by
ou d'autres éléments que je ne connais peut-être pas, par exemple?
COUNT(expr)
comptera le nombre de lignes pour lesquelles expr
n'est pas null, vous pouvez donc compter le nombre de null avec des expressions telles que:
SELECT count(a) nb_a_not_null,
count(b) nb_b_not_null,
count(*) - count(a) nb_a_null,
count(*) - count(b) nb_b_null,
count(case when a is not null and b is not null then 1 end)nb_a_b_not_null
count(case when a is null and b is null then 1 end) nb_a_and_b_null
FROM my_table
Quelque chose comme ça:
SELECT sum (cas Lorsque a est nul et b est nul, alors 1 Sinon 0 Fin) comme les deux, le nombre nul, sum (case lorsque a est null et b n'est pas null, alors 1 sinon 0 end) comme seul_a_is_null_count FROM. votre_table
Vous pouvez étendre cela pour d'autres combinaisons de null/not null
select sum(decode(a,null,0,1)) as "NotNullCount", sum(decode(a,null,1,0)) as "NullCount"
from myTable;
Répétez l'opération pour autant de champs que vous le souhaitez.
Cela peut être accompli dans Oracle juste en 1 rangée:
SELECT COUNT(NVL(potential_null_column, 0)) FROM table;
La fonctionNVLvérifie si le premier argument est nul et le traite comme une valeur du deuxième argument.
Une façon de le faire serait:
select count(*) from table group by nvl2(a, 0, 1), nvl2(b, 0, 1) having nvl2(a,0,1) = nvl2(b,0,1);
Cela a bien fonctionné pour moi afin de compter le nombre total de cellules vides sur un groupe de colonnes dans une table dans Oracle: j'ai ajouté le trim pour compter les espaces vides comme nuls.
SELECT (sum(case
when trim(a) is null Then 1
else 0
end)) +
(sum(case
when trim(b) is null
else 0
end)) +
(sum(case
when trim(c) is null
else 0
end)) as NullCount
FROM your_table
J'espère que cela t'aides
À votre santé.