我有一个表(作业类型),其中包含一个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,但却看不到前进的方向。 (抱歉,如果我遗漏了一些非常简单的东西,但除了选择陈述之外,我通常没有理由做任何事情。)
答案 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