Usar la distinción entre count(*)y count(a)también funciona bien congroup by
shannon
1
@shannon Estoy de acuerdo, COUNT(a)es un comentario útil para agregar, pero esto arroja una advertencia / error dependiendo de su pila y podría justificar un comentario en el código. Preferiría el SUMmétodo
Richard
44
Prefiero count(*)acount(1)
Lei Zhao
61
Si entendí correctamente, desea contar todo NULL y todo NOT NULL en una columna ...
Si eso es correcto:
SELECT count(*)FROM us WHERE a ISNULLUNIONALLSELECT count(*)FROM us WHERE a ISNOTNULL
Editado para tener la consulta completa, después de leer los comentarios:]
SELECT COUNT(*),'null_tally'AS narrative
FROM us
WHERE a ISNULLUNIONSELECT COUNT(*),'not_null_tally'AS narrative
FROM us
WHERE a ISNOTNULL;
+1: Con mucho, la forma más simple y rápida. Me sorprendió cuando cada respuesta no era esta.
Eric
66
Si pero no. Creo que él quiere tener el número de NULL y no es NULL en una sola consulta ... Usted está diciendo cómo hacer eso en dos consultas ...
Romain Linsolas
@romaintaz: Muy bien. Leí el título como la pregunta. En cinco ediciones, nadie pensó en arreglarlo. Yeesh
Eric
@romaintaz: Sí, tienes razón, lo he tomado como una "consulta de ejecución única para detectar cuántos valores nulos tenemos", ni siquiera sé por qué ^^ ', voy a corregir, gracias.
Alberto Zaccagni
1
@Montecristo: Porque el título solo pedía contar null:)
Eric
42
Aquí hay una versión rápida y sucia que funciona en Oracle:
select sum(case a whennullthen1else0)"Null values",
sum(case a whennullthen0else1)"Non-null values"from us
Una sintaxis similar también funcionaría en SQL Server. Además, hacerlo de esta manera solo escaneará la tabla una vez; Las soluciones UNION harán dos escaneos de tabla. Irrelevante para mesas pequeñas, muy importante para las grandes.
Philip Kelley
2
El único cambio para SQL Server "Null values"debería hacerse 'Null values'. Comillas simples, no dobles.
Eric
1
SQLServer utiliza una exploración de índice para esta consulta frente a dos búsquedas de índice utilizando una unión. En una mesa con 40,000 filas, no hay diferencia de velocidad.
Lieven Keersmaekers
1
En una tabla con 11.332.581 filas, hay dos escaneos de tabla , sin diferencia de velocidad notable (en realidad, la unión es un poco más rápida).
Lieven Keersmaekers
1
Esto no funcionó para mí en Oracle 11g. La versión @ user155789 publicada con "caso cuando a es nulo y luego 1 más 0 final" fue la sintaxis que funcionó.
Steve
25
Como entendí tu consulta, solo ejecutas este script y obtienes filas Total Null, Total NotNull,
Buena salsa, hombre, mira los planes de ejecución para estas consultas. Estás iniciando los escaneos de mesa de izquierda a derecha, especialmente donde hay una declaración tan simple select count(*) from t where a is nullque hace esto.
Eric
2
No tengo una base de datos a mano para buscar, pero la columna está indexada o no. Si es así, sucede a través de un escaneo de rango, de lo contrario, le queda prácticamente un escaneo de tabla completo. En Oracle, los NULL no se almacenan en el índice, por lo que sospecho que su ejemplo no es mucho mejor. Tu kilometraje puede muy.
EvilTeach
1
@EvilTeach: los índices solo son útiles cuando no retrocede> ~ 10% de las filas. Después de eso, se inician exploraciones completas. En este caso, obtendrá el escaneo al menos una vez, si no dos veces.
Eric
19
usualmente uso este truco
select sum(casewhen a isnullthen0else1end)as count_notnull,
sum(casewhen a isnullthen1else0end)as count_null
from tab
groupby a
Como puede ver en la imagen, el primer resultado muestra que la tabla tiene 16 filas. de las cuales dos filas son NULL. Entonces, cuando usamos Count (*), el motor de consulta cuenta el número de filas, así que obtuvimos el resultado de la cuenta como 16. Pero en el caso de Count (empid) contó los valores no NULL en la columna vacía . Entonces obtuvimos el resultado como 14.
así que cada vez que usemos COUNT (Columna) asegúrese de cuidar los valores NULL como se muestra a continuación.
select COUNT(isnull(empid,1))from@table1
contará los valores NULL y Non-NULL.
Nota : Lo mismo se aplica incluso cuando la tabla está compuesta por más de una columna. Count (1) dará el número total de filas independientemente de los valores NULL / Non-NULL. Solo cuando los valores de la columna se cuentan utilizando Count (Column) necesitamos cuidar los valores NULL.
Tuve un problema similar: contar todos los valores distintos, contando los valores nulos como 1 también. Un recuento simple no funciona en este caso, ya que no tiene en cuenta los valores nulos.
Aquí hay un fragmento que funciona en SQL y no implica la selección de nuevos valores. Básicamente, una vez realizado el distintivo, también devuelve el número de fila en una nueva columna (n) utilizando la función row_number (), luego realiza un recuento en esa columna:
SELECT COUNT(n)FROM(SELECT*, row_number()OVER(ORDERBY[MyColumn]ASC) n
FROM(SELECTDISTINCT[MyColumn]FROM[MyTable]) items
) distinctItems
Esta también es una respuesta digna. Personalmente descubrí que COUNT (DISTINCT ISNULL (A, '')) funciona aún mejor que COUNT (DISTINCT A) + SUM (CASO CUANDO A ES NULO ENTONCES 1 OTRO 0 FIN)
Vladislav
1
si es mysql, puedes probar algo como esto.
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
Es fugoso, pero devolverá un único registro con 2 cols que indica el recuento de nulos frente a no nulos.
Esto funciona en T-SQL. Si solo cuenta el número de algo y desea incluir los valores nulos, use COALESCE en lugar de mayúsculas.
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')
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
Vishal Chhodwani
1
Todas las respuestas son incorrectas o extremadamente desactualizadas.
La forma simple y correcta de hacer esta consulta es mediante la COUNT_IFfunción.
SELECT
COUNT_IF(a ISNULL)AS nulls,
COUNT_IF(a ISNOTNULL)AS not_nulls
FROM
us
a IS NULLproduce TRUEor FALSE, y COUNT () contará todos los valores NOT NULL. Entonces count(a is null)devolverá el recuento de todas las filas.
ypresto
0
En mi caso, quería la " distribución nula " entre varias columnas:
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,...
Según el '...' es fácilmente extensible a más columnas, tantas como sea necesario
union
aquí? La respuesta de Montecristo es, con mucho, la mejor solución.Respuestas:
Esto funciona para Oracle y SQL Server (es posible que pueda hacer que funcione en otro RDBMS):
O:
fuente
count(*)
ycount(a)
también funciona bien congroup by
COUNT(a)
es un comentario útil para agregar, pero esto arroja una advertencia / error dependiendo de su pila y podría justificar un comentario en el código. Preferiría elSUM
métodocount(*)
acount(1)
Si entendí correctamente, desea contar todo NULL y todo NOT NULL en una columna ...
Si eso es correcto:
Editado para tener la consulta completa, después de leer los comentarios:]
fuente
null
:)Aquí hay una versión rápida y sucia que funciona en Oracle:
fuente
"Null values"
debería hacerse'Null values'
. Comillas simples, no dobles.Como entendí tu consulta, solo ejecutas este script y obtienes filas Total Null, Total NotNull,
fuente
para no nulos
para nulos
Por lo tanto
debería hacer el trabajo
Mejor en eso los títulos de columna salen correctos.
En algunas pruebas en mi sistema, cuesta un escaneo completo de la tabla.
fuente
select count(*) from t where a is null
que hace esto.usualmente uso este truco
fuente
Solo para proporcionar otra alternativa, Postgres 9.4+ permite aplicar
FILTER
a los agregados :SQLFiddle: http://sqlfiddle.com/#!17/80a24/5
fuente
Esto es un poco complicado. Suponga que la tabla tiene solo una columna, entonces el Conteo (1) y el Conteo (*) darán valores diferentes.
Resultados de consultas
Como puede ver en la imagen, el primer resultado muestra que la tabla tiene 16 filas. de las cuales dos filas son NULL. Entonces, cuando usamos Count (*), el motor de consulta cuenta el número de filas, así que obtuvimos el resultado de la cuenta como 16. Pero en el caso de Count (empid) contó los valores no NULL en la columna vacía . Entonces obtuvimos el resultado como 14.
así que cada vez que usemos COUNT (Columna) asegúrese de cuidar los valores NULL como se muestra a continuación.
contará los valores NULL y Non-NULL.
Nota : Lo mismo se aplica incluso cuando la tabla está compuesta por más de una columna. Count (1) dará el número total de filas independientemente de los valores NULL / Non-NULL. Solo cuando los valores de la columna se cuentan utilizando Count (Column) necesitamos cuidar los valores NULL.
fuente
Tuve un problema similar: contar todos los valores distintos, contando los valores nulos como 1 también. Un recuento simple no funciona en este caso, ya que no tiene en cuenta los valores nulos.
Aquí hay un fragmento que funciona en SQL y no implica la selección de nuevos valores. Básicamente, una vez realizado el distintivo, también devuelve el número de fila en una nueva columna (n) utilizando la función row_number (), luego realiza un recuento en esa columna:
fuente
Aquí hay dos soluciones:
O
fuente
Tratar
¡Sencillo!
fuente
Prueba esto..
fuente
Si está utilizando MS Sql Server ...
No te recomiendo que hagas esto ... pero aquí lo tienes (en la misma tabla como resultado)
fuente
use la función incrustada ISNULL.
fuente
si es mysql, puedes probar algo como esto.
fuente
Es fugoso, pero devolverá un único registro con 2 cols que indica el recuento de nulos frente a no nulos.
fuente
Esto funciona en T-SQL. Si solo cuenta el número de algo y desea incluir los valores nulos, use COALESCE en lugar de mayúsculas.
fuente
Partiendo de Alberto, agregué el paquete acumulativo.
fuente
fuente
fuente
Todas las respuestas son incorrectas o extremadamente desactualizadas.
La forma simple y correcta de hacer esta consulta es mediante la
COUNT_IF
función.fuente
Por si acaso lo quisieras en un solo registro:
;-)
fuente
para contar valores no nulos
para contar valores nulos
fuente
Creé la tabla en postgres 10 y las dos siguientes funcionaron:
select count(*) from us
y
select count(a is null) from us
fuente
a IS NULL
produceTRUE
orFALSE
, y COUNT () contará todos los valores NOT NULL. Entoncescount(a is null)
devolverá el recuento de todas las filas.En mi caso, quería la " distribución nula " entre varias columnas:
Según el '...' es fácilmente extensible a más columnas, tantas como sea necesario
fuente
Número de elementos donde a es nulo:
Número de elementos donde a no es nulo:
fuente