2010-02-03 15 views
7

Estoy diseñando una consulta en SSMS 2005, que se ve algo como esto:select count (valor distintivo) devuelve 1

SELECT COUNT(DISTINCT ColumnName) FROM Table WHERE ColumnName IS NOT NULL 

Cuando ejecuto la consulta con COUNT() devuelve el valor 1. Cuando ejecutarlo sin COUNT(), SSMS informa el valor correcto, por ejemplo, 212 registros.

La columna en cuestión es de tipo de datos numéricos (16, 0).

Para aquellos que pudieran preguntar, la consulta en su totalidad es:

SELECT COUNT(DISTINCT O_ID) FROM vEmployers 
INNER JOIN vEnrolment ON O_ID = E_EnrolmentEmployer 
WHERE E_START >= '01-AUG-2008' AND E_START < '01-AUG-2009' 
AND O_ID IS NOT NULL AND O_ID IN (
    SELECT O_ID FROM vEmployers 
    INNER JOIN vEnrolment ON O_ID = E_EnrolmentEmployer 
    WHERE E_Start < '01-AUG-2008' and E_Start >= '01-AUG-2007' 
) 

Esta consulta, básicamente, da una cifra de negocios de repetición entre dos períodos 12month.

Así que me pregunto por qué "COUNT (DISTINCT ColumnName)" está devolviendo 1 cuando "ColumnName IS NOT NULL" ha sido especificado?

Este es un ejemplo de los datos cuando se ejecuta SELECT TOP 10 ColumnName distinto de ... etc:

1346116 
1346131 
1346425 
1346923 
1349935 
1350115 
1350153 
2594787 
2821944 
2879631 
+0

@GateKiller: ¿Estás absolutamente seguro de que positivamente que acaba omite el 'COUNT' y nada más? – Quassnoi

+0

@Quassnoi: Sí. – GateKiller

+0

Apreciar toda tu ayuda hasta ahora chicos :) – GateKiller

Respuesta

5

El uso de los botones numéricos (16, 0) me hizo sospechar que era el tipo de datos relacionados. Añadir un dominante en la cláusula RECUENTO para lanzarlo a un tipo INT:

Count(Distinct Cast(O_ID as Int)) 
+0

Gracias Turnkey :) – GateKiller

0

supongo que es porque todas las filas devueltas comparten el mismo valor para O_ID. Puede hacer un COUNT(*) o COUNT() en una clave que es exclusiva de cada fila para obtener el recuento de filas.

+0

Todas las filas devueltas son únicas debido a la cláusula DISTINCT, probada al hacer la consulta con COUNT(). – GateKiller

+0

¿Puede proporcionar un breve extracto de los resultados sin el recuento, solo mostrando algunos O_ID? – Turnkey

+0

Bueno, COUNT (DISTINCT ...) contará, por supuesto, valores únicos no NULL, y eso es todo. No haga distinciones, cuente (*) o cuente algo que sea único en todas sus filas, SIN una cláusula DISTINCT. –

0

Elimine DISTINCT y obtendrá un recuento de todas las filas.

+0

Es cierto. Pero como puede ver en la consulta completa, existe una unión implicada, por lo que devolvería las identificaciones duplicadas. Y no responde la pregunta de por qué COUNT() devuelve 1 cuando no debería. – GateKiller

+0

Sí, eso es desconcertante, gracias por publicar la información adicional. ¿Ejecutó exactamente la misma consulta para obtener el extracto, simplemente eliminando el conteo? – Turnkey

+0

Sí, el extracto es exactamente la misma consulta sin usar la función COUNT(). ¡Muy desconcertante! – GateKiller

0

Sería tan amable ejecutar estas consultas:

SELECT COUNT(DISTINCT O_ID) 
FROM vEmployers 
INNER JOIN 
     vEnrolment 
ON  O_ID = E_EnrolmentEmployer 
WHERE E_START >= '01-AUG-2008' AND 
     E_START < '01-AUG-2009' 
     AND O_ID IN 
     (
     SELECT O_ID 
     FROM vEmployers 
     INNER JOIN 
       vEnrolment 
     ON  O_ID = E_EnrolmentEmployer 
     WHERE E_Start < '01-AUG-2008' 
       AND E_Start >= '01-AUG-2007' 
     ) 

y

SELECT DISTINCT TOP 5 O_ID 
FROM vEmployers 
INNER JOIN 
     vEnrolment 
ON  O_ID = E_EnrolmentEmployer 
WHERE E_START >= '01-AUG-2008' AND 
     E_START < '01-AUG-2009' 
     AND O_ID IN 
     (
     SELECT O_ID 
     FROM vEmployers 
     INNER JOIN 
       vEnrolment 
     ON  O_ID = E_EnrolmentEmployer 
     WHERE E_Start < '01-AUG-2008' 
       AND E_Start >= '01-AUG-2007' 
     ) 
ORDER BY 
     O_ID 

pie de la letra, sin cambiar nada?

+0

La primera consulta devuelve una fila con el valor "1". La segunda consulta devuelve cinco filas de valores únicos. – GateKiller

+0

@GateKiller: ¿podría publicar la estructura de las tablas? – Quassnoi

+0

¿Qué información le interesa? No estoy seguro de poder publicar el esquema completo de la tabla + cada tabla tiene MUCHAS columnas. – GateKiller

0
SELECT 
    COUNT(*) 
FROM vEmployers 
INNER JOIN vEnrolment ON O_ID = E_EnrolmentEmployer 
WHERE 
     E_START >= '01-AUG-2008' 
     AND E_START < '01-AUG-2009' 
     AND O_ID IS NOT NULL AND O_ID IN (
      SELECT O_ID FROM vEmployers 
      INNER JOIN vEnrolment ON O_ID = E_EnrolmentEmployer 
      WHERE E_Start < '01-AUG-2008' and E_Start >= '01-AUG-2007' 
     ) 
GROUP BY 
    O_Id 
Cuestiones relacionadas