2011-10-03 16 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 

Próbuję wyświetlić listę pracowników, którzy pracują tylko w wielu projektach, na podstawie identyfikatora projektu. Próbowałem różne i GROUP BY. ale nie jestem w stanie dokładnie tego zrozumieć.Liczba odrębnych rekordów - SQL

z powyższej tabeli oczekuję wynik podobny do tego

empid projectId 
    100  500   
    100  501   
    100  502 

Odpowiedz

6

Spróbuj (zmieniony kod)

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

To powinno dać

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

3 row(s) 

Edit Treść dodana f lub OP dodatkowe pytanie w komentarzach

zliczania daje distint ProjectIds oznaczałoby, że GROUP BY będzie na poziomie EmpId i nie ma potrzeby podkwerendzie

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

aby uzyskać liczbę projektów dla wszystkich pracownicy z wielu projektów, wykonaj następujące czynności

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

dzięki. to działa – zod

+0

Jak pokazać, że liczy się również jako trzecia kolumna? – zod

+0

Czy chcesz 'COUNT' zadań? –

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

Naprawdę nie musisz dołączać do tej sprawy. –

+1

@MariusSolbakkenMellum Czy możesz pokazać nam, jak to zrobić, bez JOIN? –

+0

Przepraszam, trochę za szybko na spust tutaj. Czy trochę błędnie przeczytałem i pomieszałem z innym otwartym pytaniem ... –

1

można również użyć okienkowym 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 

Referencje:

Powiązane problemy