Salut, où avez-vous besoin de ce type de code de base de données de comptage dans quelle langue de base de données parlons-nous Meilleures salutations, Iordan
IordanTanev
2
Je suis surpris qu'aucune réponse unique ne contienne une simple union de select count (*) ...
Lieven Keersmaekers
1
@Lieven: Pourquoi diable utiliseriez-vous un unionici? La réponse de Montecristo est de loin la meilleure solution.
Eric
1
Parce que OP le veut avec une seule requête. La réponse de Montecristo est en effet de loin la meilleure solution ... il a juste besoin d'ajouter le syndicat :)
Lieven Keersmaekers
1
Et c'est ce que j'obtiens en lisant le titre. Va éditer.
Eric
Réponses:
231
Cela fonctionne pour Oracle et SQL Server (vous pourrez peut-être le faire fonctionner sur un autre SGBDR):
select sum(casewhen a isnullthen1else0end) count_nulls
, count(a) count_not_nulls
from us;
Utiliser la distinction entre count(*)et count(a)fonctionne bien avecgroup by
shannon
1
@shannon Je suis d'accord, COUNT(a)est un commentaire utile à ajouter, mais cela génère un avertissement / une erreur en fonction de votre pile et peut justifier un commentaire dans le code. Je préférerais la SUMméthode.
Richard
4
Préférez count(*)àcount(1)
Lei Zhao
61
Si j'ai bien compris, vous voulez compter tous les NULL et tous les NOT NULL dans une colonne ...
Si c'est correct:
SELECT count(*)FROM us WHERE a ISNULLUNIONALLSELECT count(*)FROM us WHERE a ISNOTNULL
Modifié pour avoir la requête complète, après avoir lu les commentaires:]
SELECT COUNT(*),'null_tally'AS narrative
FROM us
WHERE a ISNULLUNIONSELECT COUNT(*),'not_null_tally'AS narrative
FROM us
WHERE a ISNOTNULL;
+1: De loin le moyen le plus simple et le plus rapide. J'ai été choqué lorsque chaque réponse n'était pas celle-ci.
Eric
6
Oui mais non. Je pense qu'il veut avoir le nombre de NULL et non de NULL en une seule requête ... Vous dites comment faire cela en deux requêtes ...
Romain Linsolas
@romaintaz: C'est vrai. J'ai lu le titre comme la question. En cinq modifications, personne n'a pensé à le réparer. Yeesh.
Eric
@romaintaz: Oui, vous avez raison, j'ai pris cela comme une "requête exécutée une fois pour repérer le nombre de valeurs nulles que nous avons", je ne sais même pas pourquoi ^^ ', je vais corriger, merci.
Alberto Zaccagni
1
@Montecristo: Parce que le titre ne demandait qu'à compter null:)
Eric
42
Voici une version rapide et sale qui fonctionne sur Oracle:
select sum(case a whennullthen1else0)"Null values",
sum(case a whennullthen0else1)"Non-null values"from us
Une syntaxe similaire fonctionnerait également dans SQL Server. De plus, en procédant de cette manière, la table ne sera analysée qu'une seule fois; les solutions UNION effectueront deux analyses de table. Peu pertinent pour les petites tables, très important pour les grandes.
Philip Kelley
2
Seul changement pour SQL Server "Null values"devrait devenir 'Null values'. Guillemets simples, pas doubles.
Eric
1
SQLServer utilise une analyse d'index pour cette requête par rapport à deux recherches d'index à l' aide d'une union. Sur une table de 40 000 lignes, il n'y a pas de différence de vitesse.
Lieven Keersmaekers
1
Sur une table avec 11.332.581 lignes, il y a deux balayages de table , pas de différence de vitesse notable (en fait, l'union est légèrement plus rapide).
Lieven Keersmaekers
1
Cela n'a pas fonctionné pour moi dans Oracle 11g. La version @ user155789 publiée avec "case when a is null then 1 else 0 end" était la syntaxe qui fonctionnait.
Steve
25
Comme j'ai compris votre requête, exécutez simplement ce script et obtenez Total Null, Total NotNull,
Bonne sauce, mec, regardez les plans d'exécution de ces requêtes. Vous lancez des scans de table à gauche et à droite, en particulier là où il y a une déclaration si simple ( select count(*) from t where a is null) qui fait cela.
Eric
2
Je n'ai pas de base de données à portée de main, mais la colonne est indexée ou non. Si c'est le cas, cela se produit via une analyse de plage, sinon, vous vous retrouvez à peu près avec une analyse complète de la table. Dans oracle, les NULL ne sont pas stockés dans l'index, donc je suppose que votre exemple n'est pas beaucoup mieux. Votre kilométrage peut très bien.
EvilTeach
1
@EvilTeach: les index ne sont utiles que lorsque vous ne retirez pas> ~ 10% des lignes. Après cela, des analyses complètes sont lancées. Dans ce cas, vous obtiendrez l'analyse au moins une fois, sinon deux fois.
Eric
19
habituellement j'utilise cette astuce
select sum(casewhen a isnullthen0else1end)as count_notnull,
sum(casewhen a isnullthen1else0end)as count_null
from tab
groupby a
Comme vous pouvez le voir sur l'image, le premier résultat montre que le tableau comporte 16 lignes. dont deux lignes sont NULL. Ainsi, lorsque nous utilisons Count (*), le moteur de requête compte le nombre de lignes, donc nous avons obtenu le résultat de count comme 16. Mais dans le cas de Count (empid), il a compté les valeurs non NULL dans la colonne empid . Nous avons donc obtenu le résultat 14.
donc chaque fois que nous utilisons COUNT (Colonne), assurez-vous que nous prenons soin des valeurs NULL comme indiqué ci-dessous.
select COUNT(isnull(empid,1))from@table1
comptera les valeurs NULL et Non-NULL.
Remarque : la même chose s'applique même lorsque le tableau est composé de plus d'une colonne. Count (1) donnera le nombre total de lignes indépendamment des valeurs NULL / Non-NULL. Ce n'est que lorsque les valeurs de colonne sont comptées à l'aide de Count (Column) que nous devons prendre soin des valeurs NULL.
J'ai eu un problème similaire: compter toutes les valeurs distinctes, en comptant également les valeurs nulles comme 1. Un simple décompte ne fonctionne pas dans ce cas, car il ne prend pas en compte les valeurs nulles.
Voici un extrait de code qui fonctionne sur SQL et n'implique pas de sélection de nouvelles valeurs. Fondamentalement, une fois effectué le distinct, renvoyez également le numéro de ligne dans une nouvelle colonne (n) en utilisant la fonction row_number (), puis effectuez un comptage sur cette colonne:
SELECT COUNT(n)FROM(SELECT*, row_number()OVER(ORDERBY[MyColumn]ASC) n
FROM(SELECTDISTINCT[MyColumn]FROM[MyTable]) items
) distinctItems
C'est aussi une bonne réponse. J'ai personnellement trouvé que COUNT (DISTINCT ISNULL (A, '')) fonctionne encore mieux que COUNT (DISTINCT A) + SUM (CASE WHEN A IS NULL PUIS 1 ELSE 0 END)
Vladislav
1
si c'est mysql, vous pouvez essayer quelque chose comme ça.
select(select count(*)from TABLENAME WHERE a ='null')as total_null,(select count(*)from TABLENAME WHERE a !='null')as total_not_null
FROM TABLENAME
SELECT SUM(NULLs)AS'NULLS', SUM(NOTNULLs)AS'NOTNULLs'FROM(select count(*)AS'NULLs',0as'NOTNULLs'FROM us WHERE a isnullUNIONselect0as'NULLs', count(*)AS'NOTNULLs'FROM us WHERE a isnotnull)AS x
C'est fugace, mais il renverra un seul enregistrement avec 2 cols indiquant le nombre de nuls par rapport aux non nuls.
Cela fonctionne dans T-SQL. Si vous comptez simplement le nombre de quelque chose et que vous souhaitez inclure les valeurs nulles, utilisez COALESCE au lieu de case.
IF OBJECT_ID('tempdb..#us')ISNOTNULLDROPTABLE#us
CREATETABLE#us
(
a INT NULL);INSERTINTO#us VALUES(1),(2),(3),(4),(NULL),(NULL),(NULL),(8),(9)SELECT*FROM#us
SELECTCASEWHEN a ISNULLTHEN'NULL'ELSE'NON-NULL'ENDAS'NULL?',
COUNT(CASEWHEN a ISNULLTHEN'NULL'ELSE'NON-NULL'END)AS'Count'FROM#us
GROUPBYCASEWHEN a ISNULLTHEN'NULL'ELSE'NON-NULL'ENDSELECTCOALESCE(CAST(a AS NVARCHAR),'NULL')AS a,
COUNT(COALESCE(CAST(a AS NVARCHAR),'NULL'))AS'Count'FROM#us
GROUPBYCOALESCE(CAST(a AS NVARCHAR),'NULL')
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la raison et / ou la manière dont ce code répond à la question améliore sa valeur à long terme.
Vishal Chhodwani
1
Toutes les réponses sont soit fausses, soit extrêmement dépassées.
La manière simple et correcte de faire cette requête est d'utiliser la COUNT_IFfonction.
SELECT
COUNT_IF(a ISNULL)AS nulls,
COUNT_IF(a ISNOTNULL)AS not_nulls
FROM
us
a IS NULLproduit TRUEou FALSE, et COUNT () comptera toutes les valeurs NOT NULL. Donc count(a is null)retournera le nombre de toutes les lignes.
ypresto
0
Dans mon cas, je voulais la " distribution nulle " entre plusieurs colonnes:
SELECT(CASEWHEN a ISNULLTHEN'NULL'ELSE'NOT-NULL'END)AS a_null,(CASEWHEN b ISNULLTHEN'NULL'ELSE'NOT-NULL'END)AS b_null,(CASEWHEN c ISNULLTHEN'NULL'ELSE'NOT-NULL'END)AS c_null,...
count(*)FROM us
GROUPBY1,2,3,...ORDERBY1,2,3,...
Selon le '...', il est facilement extensible à plus de colonnes, autant que nécessaire
union
ici? La réponse de Montecristo est de loin la meilleure solution.Réponses:
Cela fonctionne pour Oracle et SQL Server (vous pourrez peut-être le faire fonctionner sur un autre SGBDR):
Ou:
la source
count(*)
etcount(a)
fonctionne bien avecgroup by
COUNT(a)
est un commentaire utile à ajouter, mais cela génère un avertissement / une erreur en fonction de votre pile et peut justifier un commentaire dans le code. Je préférerais laSUM
méthode.count(*)
àcount(1)
Si j'ai bien compris, vous voulez compter tous les NULL et tous les NOT NULL dans une colonne ...
Si c'est correct:
Modifié pour avoir la requête complète, après avoir lu les commentaires:]
la source
null
:)Voici une version rapide et sale qui fonctionne sur Oracle:
la source
"Null values"
devrait devenir'Null values'
. Guillemets simples, pas doubles.Comme j'ai compris votre requête, exécutez simplement ce script et obtenez Total Null, Total NotNull,
la source
pour les non nuls
pour les nuls
Par conséquent
devrait faire le travail
Mieux, les titres des colonnes sont corrects.
Dans certains tests sur mon système, cela coûte une analyse complète de la table.
la source
select count(*) from t where a is null
) qui fait cela.habituellement j'utilise cette astuce
la source
Juste pour fournir une autre alternative, Postgres 9.4+ permet d'appliquer un
FILTER
aux agrégats :SQLFiddle: http://sqlfiddle.com/#!17/80a24/5
la source
C'est peu compliqué. Supposons que la table ne comporte qu'une seule colonne, puis le nombre (1) et le nombre (*) donneront des valeurs différentes.
Résultats de la requête
Comme vous pouvez le voir sur l'image, le premier résultat montre que le tableau comporte 16 lignes. dont deux lignes sont NULL. Ainsi, lorsque nous utilisons Count (*), le moteur de requête compte le nombre de lignes, donc nous avons obtenu le résultat de count comme 16. Mais dans le cas de Count (empid), il a compté les valeurs non NULL dans la colonne empid . Nous avons donc obtenu le résultat 14.
donc chaque fois que nous utilisons COUNT (Colonne), assurez-vous que nous prenons soin des valeurs NULL comme indiqué ci-dessous.
comptera les valeurs NULL et Non-NULL.
Remarque : la même chose s'applique même lorsque le tableau est composé de plus d'une colonne. Count (1) donnera le nombre total de lignes indépendamment des valeurs NULL / Non-NULL. Ce n'est que lorsque les valeurs de colonne sont comptées à l'aide de Count (Column) que nous devons prendre soin des valeurs NULL.
la source
J'ai eu un problème similaire: compter toutes les valeurs distinctes, en comptant également les valeurs nulles comme 1. Un simple décompte ne fonctionne pas dans ce cas, car il ne prend pas en compte les valeurs nulles.
Voici un extrait de code qui fonctionne sur SQL et n'implique pas de sélection de nouvelles valeurs. Fondamentalement, une fois effectué le distinct, renvoyez également le numéro de ligne dans une nouvelle colonne (n) en utilisant la fonction row_number (), puis effectuez un comptage sur cette colonne:
la source
Voici deux solutions:
OU
la source
Essayer
Facile!
la source
Essaye ça..
la source
Si vous utilisez MS Sql Server ...
Je ne vous recommande pas de faire cela ... mais vous l'avez ici (dans le même tableau que le résultat)
la source
utiliser la fonction intégrée ISNULL.
la source
si c'est mysql, vous pouvez essayer quelque chose comme ça.
la source
C'est fugace, mais il renverra un seul enregistrement avec 2 cols indiquant le nombre de nuls par rapport aux non nuls.
la source
Cela fonctionne dans T-SQL. Si vous comptez simplement le nombre de quelque chose et que vous souhaitez inclure les valeurs nulles, utilisez COALESCE au lieu de case.
la source
En m'appuyant sur Alberto, j'ai ajouté le rollup.
la source
la source
la source
Toutes les réponses sont soit fausses, soit extrêmement dépassées.
La manière simple et correcte de faire cette requête est d'utiliser la
COUNT_IF
fonction.la source
Juste au cas où vous le vouliez dans un seul enregistrement:
;-)
la source
pour compter des valeurs non nulles
pour compter les valeurs nulles
la source
J'ai créé la table dans postgres 10 et les deux ont fonctionné:
select count(*) from us
et
select count(a is null) from us
la source
a IS NULL
produitTRUE
ouFALSE
, et COUNT () comptera toutes les valeurs NOT NULL. Donccount(a is null)
retournera le nombre de toutes les lignes.Dans mon cas, je voulais la " distribution nulle " entre plusieurs colonnes:
Selon le '...', il est facilement extensible à plus de colonnes, autant que nécessaire
la source
Nombre d'éléments où a est nul:
Nombre d'éléments où a n'est pas nul:
la source