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

我想根据项目ID列出只适用于多个项目的员工。 我尝试不同和GROUP BY。但我无法完全确定。不同记录的计数 - SQL

从上表很期待这样的

empid projectId 
    100  500   
    100  501   
    100  502 

回答

6

结果试试这个(修改后的代码)

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

这应该给你

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

3 row(s) 

编辑内容添加了f在评论或OP的另一个问题

计数给你distint ProjectIds将意味着GROUP BY将在EmpId水平,无需使用子查询

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

要获得的项目数量为所有多个项目的员工,请执行下列操作

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

感谢。这项工作 – zod

+0

如何显示该数也作为第三列? – zod

+0

你想要一个任务的COUNT吗? –

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

你真的不需要加入这种情况。 –

+1

@MariusSolbakkenMellum你能向我们展示如何在没有JOIN的情况下做到这一点吗? –

+0

对不起,这里的触发很少。有一点误解,并混淆另一个未解决的问题.. –

1

你也可以使用一个窗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 

参考文献: