2011-10-03 23 views
6
empid projectId TaskID 
100  500   1 
100  501   1 
100  502   1 
101  500   2 
101  500   5 
101  500   1 
102  400   1 
103  300   2 
104  300   2 
105  300   2 

Estoy tratando de enumerar los empleados que trabajan solo en proyectos múltiples, en función de la identificación del proyecto. Probé distinto y GROUP BY. pero no puedo imaginarlo exactamente.Recuento de registros distintos - SQL

de la tabla anterior Estoy esperando un resultado como este

empid projectId 
    100  500   
    100  501   
    100  502 

Respuesta

6

Prueba este (código revisado)

SELECT DISTINCT EmpId, ProjectId 
FROM TableX 
WHERE EmpId IN 
(
    SELECT EmpId 
    FROM TableX 
    GROUP BY EmpId 
    HAVING COUNT (DISTINCT ProjectId) > 1 
) 

Esto debe darle

EmpId  ProjectId 
----------- ----------- 
100   500 
100   501 
100   502 

3 row(s) 

Editar Contenido agregado f o la pregunta PO adicional en los comentarios

Un recuento que le da DISTINT ProjectIds significaría que el GRUPO POR estaría en un nivel EmpId y sin necesidad de una subconsulta

SELECT EmpId, Count (Distinct ProjectId) Projects 
FROM TableX 
GROUP BY EmpId 

Para obtener un recuento de los proyectos para todos empleados con múltiples proyectos, haga lo siguiente

SELECT EmpId, Count (Distinct ProjectId) Projects 
FROM TableX 
GROUP BY EmpId 
Having Count (Distinct ProjectId) > 1 
+0

gracias. esto funciona – zod

+0

¿Cómo puede demostrar que también cuenta como una tercera columna? – zod

+0

¿Desea un 'COUNT' de tareas? –

0
SELECT y.empid, y.projectId 
    FROM (SELECT empid 
       FROM YourTable 
       GROUP BY empid 
       HAVING COUNT(*) > 1) t 
     INNER JOIN YourTable y 
      ON t.empid = y.empid 
    ORDER BY y.empid, y.projectId 
+2

Realmente no necesita unirse en este caso. –

+1

@MariusSolbakkenMellum ¿Puede mostrarnos cómo hace esto sin una JOIN? –

+0

Disculpe, poco rápido en el gatillo aquí. Hice un poco mal y mezclé con otra pregunta abierta. –

1

también es posible usar un COUNT() de ventana:

WITH counted AS (
    SELECT 
    empid, 
    projectId, 
    COUNT(DISTINCT projectId) OVER (PARTITION BY empid) AS ProjectCount 
    FROM atable 
) 
SELECT DISTINCT 
    empid, 
    projectId 
FROM counted 
WHERE ProjectCount > 1 

Referencias:

Cuestiones relacionadas