2017-04-12 15 views
1

ID(ジョブを完了した人)、ジョブが完了した年(YYYY)、およびジョブタイプIDを含むテーブル(ジョブタイプ)があります。私は必要なもの複数のレコードを持つID - 必要なレコードを見つける方法

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

のみ124Aであろうと、上記の表では2017年にのみJOBTYPE 2を完了したすべての人のIDを見つけることです。 (125Aは2016年にJobtype 2を完了し、123Aは1と2を完了したなど)。 Sidenote:IDが2017年に複数のJobtype 2を完了したかどうかは関係ありません。

どうすればいいですか?私はいくつかのNOT EXISTSクエリを試しましたが、1つのIDが潜在的にそれに対して多数のレコードを持つ可能性があるため、私は固執していると思います。私は何とかデータを結合してすべてのIDが1つのレコードを持つようにする必要があると思います。それとも本当に明白な何かが欠けていますか?私はSQL Server 2012で作業しており、今後の方向性はわかりません。 (私が本当にシンプルなものを見逃している場合はお詫びしますが、通常はselect文を超えて何もする必要はありません)。

答えて

4

idは、その最初のクエリの結果ではないレコードだけを選択し、その後、2017年に2されていないJOBTYPE補完があった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 | 2レコードが1つ以上、2017年には他のレコードはありませんでしたが、私はそれを1つ以上の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 
関連する問題