具有多个记录的ID - 如何查找我需要的记录?

时间:2017-04-12 13:09:15

标签: sql sql-server

我有一个表(作业类型),其中包含一个ID(完成作业的人),作业完成年份(YYYY)和作业类型ID。

|ID |   YEAR    | JOBTYPE|
|123A|  2017    |1
|124A|  2017    |2
|125A|  2016    | 2
|126A|  2017    |3
|123A|  2017    |2
|125A|  2016    |2

我需要的是找到2017年仅完成Jobtype 2的每个人的ID。在上表中,仅为124A 。 (125A在2016年完成了Jobtype 2; 123A完成了1和2;等等)。旁注:如果一个ID在2017年完成了多个Jobtype 2并不重要 - 我想要那些记录。

我该怎么做?我已经尝试了一些NOT EXISTS查询,但我认为我卡住了,因为1 ID可能会有一些记录。我猜我需要以某种方式组合数据,以便每个ID都有一条记录,然后以这种方式查询?还是我错过了一些非常明显的东西?我正在使用SQL Server 2012,但却看不到前进的方向。 (抱歉,如果我遗漏了一些非常简单的东西,但除了选择陈述之外,我通常没有理由做任何事情。)

4 个答案:

答案 0 :(得分:4)

编写一个查询以获取2017年工作类型完成次数为非2的所有ID,然后仅选择第一个查询结果中id不是的记录:

SELECT *
FROM table
WHERE jobtype = 2 and year = 2017
    AND id NOT IN (SELECT id FROM table WHERE jobtype <> 2 and Year=2017)

答案 1 :(得分:0)

您需要每个ID的信息,因此GROUP BY ID。然后在HAVING中过滤。 E.g:

select id
from jobtypes
having min(year) = 2017
   and max(year) = 2017
   and min(jobtype) = 2
   and max(jobtype) = 2
;

可以轻松调整标准。例如,其他人理解您的标准意味着:2017年有一个或多个2017 | 2记录而没有其他记录,而我将其理解为一个或多个2017 | 2记录而根本没有其他记录。如果您只想看2017年:

select id
from jobtypes
where year = 2017
having min(jobtype) = 2
   and max(jobtype) = 2
;

无论适用什么标准,该表只需阅读一次。

答案 2 :(得分:0)

希望这会奏效,

SELECT * FROM #Your_Table A WHERE JobType=2 AND Year=2017 AND NOT EXISTS(
SELECT ID FROM (SELECT *,Row_number() Over(Partition by ID Order by ID) AS Row_Num FROM #Your_Table)B
WHERE JobType=2 and Row_num>1 and B.ID=A.ID)

答案 3 :(得分:0)

SELECT a.*
FROM #test a
left join (Select id from #test where jobtype<>2 and [Year] = 2017) b on a.id=b.id
where jobtype=2 and year=2017 and b.id is null