2017-03-07 104 views
1

說我有叫ACADEMICDETAIL學生表看起來是這樣的:(ADW代表添加/刪除等等,可以有這些值「A」 =添加,「d」 =降,「W」 =等待)SQL查詢從同一列同一個表中排除某個值?

PeopleID | ADW | Class | Term | Year 
    1234  A  Math Spring 2017 
    1234  D  Spanish Spring 2017 
    1234  A  Biol Fall  2016 
    1234  A  Engl Fall  2016 
    0001  D  Engl Spring 2017 
    0001  D  Math Spring 2017 
    0001  D  Biol Spring 2017 
    5601  W  Math Spring 2017 
    2300  D  Biol Spring 2017 
    2300  A  Engl Fall  2016 

我的(壞)查詢看起來是這樣的:

SELECT distinct PeopleId 
FROM ACADEMICDETAIL 
WHERE 
Term = 'Spring' and 
Year = '2017' and 
ADW = 'D' 

我只需要拉誰已經下降的所有類特定年/學期的學生。如果有些人被拋棄,但其他人仍然被添加,我不需要這些學生成績。

所以結果我需要得到:

PeopleID 
    0001 
    2300 

現實,我的壞查詢:

PeopleID 
    0001 
    2300 
    1234 

任何提示嗎?我不想讓1234的學生出現,因爲那個學生既有增加又有減少。

回答

0

我想這就是你要找的。

SELECT DISTINCT PeopleID 
FROM ACADEMICDETAIL 
WHERE ADW = 'D' 
AND Term = 'Spring' 
AND Year = '2017' 
AND Peopleid NOT IN (SELECT DISTINCT PeopleId 
FROM ACADEMICDETAIL 
WHERE Term = 'Spring' 
AND Year = '2017' 
AND ADW IN ('A' , 'W')) 
+0

這正是我需要的!謝謝!! – Nestalna

0

嗨,我認爲你得到的結果是正確的。根據您的查詢,實際上有3個不同的行滿足您的條件。

+0

可悲的解決方案,沒有工作:( – Nestalna

+0

嗨@Nestalna您的查詢,結果是正確的。檢查我的最終答案 – Spythere

1

想想group byhaving

SELECT year, term PeopleId 
FROM ACADEMICDETAIL 
GROUP BY year, term, PeopleId 
HAVING MIN(ADW) = 'D' and MAX(ADW) = 'D'; 

這將選擇所有term /年combinations. You can of course use a WHERE`子句來限制只有一個或幾個。

+0

這有助於不同學生的身份證明,但仍然沒有消除每個學生的Adds,換句話說,我仍然讓學生有Adds和Drops,我試圖查找所有隻有學生的學生下降。希望有所幫助!謝謝! – Nestalna

+0

@Nestalnaj。 。 。這不能返回添加的學生。注意'HAVING'子句。 ADW的最小值和最大值相等,都是D''。因此,只有D''s。 –

0

如果該特定ID存在任何其他AWD,則需要檢查每個PeopleID。

SELECT distinct PeopleId 
FROM ACADEMICDETAIL AS A 
WHERE 
Term = 'Spring' and Year = '2017' and 
((Select count (*) from ACADEMICDETAIL as A1 where AWD = 'D' and A1.PeopleID = A.PeopleID) - 
(Select count (*) from ACADEMICDETAIL as A2 where AWD = 'A' and A2.PeopleID = A.PeopleID)) >= 0 

EDIT1:

我創建表,插入數據和運行查詢。 你可以看到結果HERE

+0

偉大的想法,但它仍然返回一些添加和一些下降的人。我正在尋找那些只有下降,沒有增加,沒有等待的人。感謝壽! – Nestalna

+0

我修好了,應該現在就工作。快樂的編碼 –

+0

嗯,它不應該返回學生2300,因爲他/她在那個年份/學期也有一個下降? – Nestalna

0

enter image description here

如果不同的數據。實際上你會得到3個不同的價值。總之你的腳本和結果是相互矛盾的

+0

我知道這是正確的,但它不是我正在尋找的。我正在尋找一種方法來修改我的查詢以獲得所需的結果。我的查詢缺少一些內容,以確保只有具有特定年份/學期的所有Drops的學生纔會顯示在結果中。希望有所幫助! – Nestalna

+0

然後告訴我你想要做什麼樣的條件? – Spythere

+0

我有什麼你想做的。哈哈對不起。你想要做的是你只想看到PEOPLEID沒有ADW ='A'的結果? – Spythere

0

試試下面

-- to display 2017 Drop only select distinct PeopleID from ACADEMICDETAIL t1 where adw = 'D' and year = 2017 and not exists (select 1 from ACADEMICDETAIL t2 where t1.year = t2.year and t1.adw <> t2.ADW and t1.PeopleID = t2.PeopleID)

-- to display all Drop years select distinct PeopleID,Year from ACADEMICDETAIL t1 where adw = 'D' and not exists (select 1 from ACADEMICDETAIL t2 where t1.year = t2.year and t1.adw <> t2.ADW and t1.PeopleID = t2.PeopleID)

相關問題