Seguramente, muchos de vosotros habréis usado en innumerables ocasiones la función de T-SQL COUNT, que no hace sino devolver un número de registros: de una tabla, de un conjunto de resultados, etc...
En una de sus aplicaciones, combinado con el DISTINCT -uno de los dos argumentos que admite- COUNT nos devuelve el número de valores únicos no nulos de la tabla o conjunto de resultados que estemos consultando.
Pero ¡ojo! Cuidado con la sintaxis, o podemos obtener el valor equivocado sin darnos cuenta. No es lo mismo:
SELECT COUNT (DISTINCT NombreCampo) FROM NombreTabla
que:
SELECT COUNT(*), DISTINCT NombreCampo FROM NombreTabla
Mientras la primera de las dos nos devolverá justo lo que ya habíamos definido (cuenta de valores únicos no nulos) en único resultado, la segunda nos devolverá el número de registros que tienen cada uno de los valores únicos que tiene la tabla.
Confundir estas dos expresiones es especialmente peligroso si la tabla sólo tiene un valor en el campo que estamos consultando, ya que el número de valores devueltos será el mismo en los dos casos: 1; aunque con dos columnas en el segundo de ellos.
Es decir, ante una tabla Clientes como esta:
En una de sus aplicaciones, combinado con el DISTINCT -uno de los dos argumentos que admite- COUNT nos devuelve el número de valores únicos no nulos de la tabla o conjunto de resultados que estemos consultando.
Pero ¡ojo! Cuidado con la sintaxis, o podemos obtener el valor equivocado sin darnos cuenta. No es lo mismo:
SELECT COUNT (DISTINCT NombreCampo) FROM NombreTabla
que:
SELECT COUNT(*), DISTINCT NombreCampo FROM NombreTabla
Mientras la primera de las dos nos devolverá justo lo que ya habíamos definido (cuenta de valores únicos no nulos) en único resultado, la segunda nos devolverá el número de registros que tienen cada uno de los valores únicos que tiene la tabla.
Confundir estas dos expresiones es especialmente peligroso si la tabla sólo tiene un valor en el campo que estamos consultando, ya que el número de valores devueltos será el mismo en los dos casos: 1; aunque con dos columnas en el segundo de ellos.
Es decir, ante una tabla Clientes como esta:
Codigo | Nombre |
1 | Juan |
2 | Pedro |
3 | Juan |
La consulta SELECT COUNT (DISTINCT Nombre) FROM Clientes, nos devolverá 2.
La consulta SELECT COUNT (*), DISTINCT Nombre FROM Clientes, nos devolverá:
2 Juan
1 Pedro
Un resultado equivalente se podría obtener con:
SELECT COUNT(*), Nombre FROM Clientes GROUP BY Nombre.
Un resultado equivalente se podría obtener con:
SELECT COUNT(*), Nombre FROM Clientes GROUP BY Nombre.
Pero, si la tabla es como sigue:
Codigo | Nombre |
1 | Juan |
2 | Juan |
3 | Juan |
La consulta SELECT COUNT (DISTINCT Nombre) FROM Clientes, nos devolverá 1.
La consulta SELECT COUNT (*), DISTINCT Nombre FROM Clientes, nos devolverá:
3 Juan.
Así pues, habrá que prestar especial atención a cómo escribimos la consulta, teniendo claro cuál es el resultado que queremos obtener. Si queremos saber cuántos nombres distintos hay en nuestra tabla clientes, el resultado que debemos esperar es el 1 que nos devuelve la primera de ellas, y no ese 3 de la segunda, que nos indica cuántos Juan hay entre nuestros clientes.
Excelente aporte, muchas gracias, estaba buscando este tema en todas partes y por fin lo encontré aquí, muchas gracias, saludos y muchos éxitos.
ResponderEliminarGracias a ti por el comentario, Juan Carlos.
Eliminarmucha gracias Crack, me ayudo mucho
ResponderEliminarMe alegro. Gracias a ti por dejar el comentario.
EliminarHola quisiera saber si me podes ayudar tengo una base en el cual tengo numero de documento y otro de Estado para el mismo nro de documento tengo varios estados
ResponderEliminarpero quiero que dicha consulta me muestre los estados Completo y en Proceso, me podrias decir como puedo hacerlo desde ya muchas gracias Saludos
Hola, Luis:
EliminarLa pregunta es un poco confusa. Entiendo que tienes una tabla de documentos y otra de estados de documentos, y que para un documento en la tabla de documentos puede haber varios estados en la tabla de estados.
Si es así, la solución te la da un INNER JOIN y un WHERE, así:
SELECT ListaDeCampos
FROM dbo.TablaDocumentos D
INNER JOIN dbo.TablaEstadoDocumentos ED ON ED.NumeroDocumento = D.NumeroDocumento
WHERE ED.Estado IN (ValorDeEstadoCompleto, ED.ValorDeEstadoEnProceso);
Espero haber podido ayudarte.
Saludos.
Ndocumento | Estado
ResponderEliminar458785825 | COMPLETO
458785825 | EN PROCESO
458785825 | CANCELADO
253484423 | EN PROCESO
253484423 | CANCELADO
Es la misma tabla en la cual tengo para el mismo documento varios Estados y lo que quiero saber cuales son los documentos que tengo en su estado CANCELADO Y EN PROCESO, Perdon si no fui claro en la otra pregunta que hice desde ya muchas gracias.
De acuerdo, Luis:
EliminarEntonces solamente necesitas el JOIN con la misma tabla
SELECT ListaDeCampos
FROM dbo.TablaDocumentos D1
INNER JOIN dbo.TablaDocumentos D2 ON D1.NumeroDocumento = D2.NumeroDocumento
WHERE D1.Estado = 'CANCELADO' AND D2.Estado = 'EN PROCESO'
Saludos
Muchas Gracias saludos
ResponderEliminarMuchisimas gracias por la aportacion
ResponderEliminar26-05-2022
interesante pero creo que completar con el having aqui un post que puede ayudar https://thedevelopmentstages.com/having-count-sql-con-ejemplos/
ResponderEliminar