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
I am trying to list the employees who works on multiple project only, based on project id . I tried distinct and GROUP BY . but am not able figure it exactly.
from the above table am expecting a result like this
empid projectId
100 500
100 501
100 502
Try this (revised code)
SELECT DISTINCT EmpId, ProjectId
FROM TableX
WHERE EmpId IN
(
SELECT EmpId
FROM TableX
GROUP BY EmpId
HAVING COUNT (DISTINCT ProjectId) > 1
)
This should give you
EmpId ProjectId
----------- -----------
100 500
100 501
100 502
3 row(s)
Edit Content added for OPs additional question in the comments
A count giving you distint ProjectIds would mean that the GROUP BY would be at an EmpId
level and no need for a subquery
SELECT EmpId, Count (Distinct ProjectId) Projects
FROM TableX
GROUP BY EmpId
To get a count of projects for all employees with multiple projects, do the following
SELECT EmpId, Count (Distinct ProjectId) Projects
FROM TableX
GROUP BY EmpId
Having Count (Distinct ProjectId) > 1
You could also use a windowed COUNT()
:
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
References:
OLAP functions
WITH clause
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With