2017-03-07 102 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)

相关问题