2017-04-12 65 views
1

我有一个包含ID(用于完成作业的人),作业完成年份(YYYY)和Jobtype Id的表格(作业类型)。具有多个记录的ID - 如何查找我需要的记录?

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

我需要的是找到所有人的,只有完成Jobtype 2在2017年在上表中的ID,这将只有124A。 (2016年完成了125人的Jobtype 2; 123A完成了1和2;等等)。旁注:如果一个ID在2017年完成了多个Jobtype 2,那么无关紧要 - 我想要这些记录。

我该怎么做?我已经尝试了一些NOT EXISTS查询,但是我认为我会陷入困境,因为1 ID可能会有一些记录反对它。我猜我需要以某种方式组合数据,所以每个ID都有一条记录,然后以这种方式进行查询?或者我错过了一些非常明显的东西?我在SQL Server 2012中工作,只是看不到前进的方向。 (如果我错过了一些非常简单的道歉,但是我通常没有理由在选择语句之外做任何事情)。

回答

4

编写一个查询来获取所有的id那里有jobtype完井是不是2在2017年,然后只选择记录中,其中id是不是在第一次查询的结果:

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

啊哈!不在!非常感谢你 - 我当然试图创造一个比它需要的复杂得多的解决方案! – ProfEng

0

你想要每个ID的信息,所以GROUP BY ID。然后在HAVING中过滤。例如:

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 
; 

无论适用的标准,该表必须只读一次。

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) 
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 
相关问题