2017-04-12 69 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 
相關問題