我列出了要完成多个英语水平的学生。有没有办法找到那些正在学习英语I而又没有升入新水平的学生
ID STUDENTID NAME ENGLISHLEVEL STARTDATE ENDDATE
----------------------------------------------------------------
1 001 Eric English-1 2017-01-01 2018-01-01
2 002 Brian English-1 2017-01-01 2017-01-31
3 002 Brian English-2 2017-02-01 2017-03-01
4 003 David English-1 2017-05-01 2017-06-01
5 003 David English-2 2017-06-02 2017-07-03
我有一个与上述类似的列表,供成千上万的学生使用,我想知道如何查询该表,向我显示那些学习过英语1但从未开始使用英语2或英语3的学生
建议将不胜感激。
答案 0 :(得分:1)
您可以使用outer join
将表与其自身连接。让外部联接表检查English2 / 3,然后过滤出匹配的所有结果。
select
eng1.*
from
students_table eng1
left outer join students_table eng2
on (
eng1.STUDENTID=eng2.STUDENTID
and eng2.ENGLISHLEVEL in ('English-2', 'English-3')
)
where
eng2.STUDENTID is null -- Filter out rows where an eng2 row was found
答案 1 :(得分:1)
您可以使用not exists
:
select t.*
from table t
where not exists (select 1
from table t1
where t1.STUDENTID = t.STUDENTID and
t1.ENGLISHLEVEL in ('English-2', 'English-3')
);
答案 2 :(得分:1)
您的英语水平可以按字母顺序排序:
select studentid, name
from t
group by studentid, name
having max(englishlevel) = 'English-1'
答案 3 :(得分:0)
您可以在IN
语句中使用WHERE
来获得那些学习过英语1的学生
SELECT * FROM tblStudents
WHERE ENGLISHLEVEL IN ('English-1')
答案 4 :(得分:0)
“我正在学习英语的学生”在您的帖子表格中的数据含义是什么?
表格中的数据术语“和没有转移到下一层”是什么意思?
您是否有一个表,其中包含所有可能的ENGLISHLEVEL值?
如何填充STARTDATE和ENDDATE列?
如果仅在人员实际完成培训后填充ENDDATE,则可以在此处使用NULL值来查找尚未完成培训的人员。那可能就是去这里的方式。
如果您有一个表定义了ENGLISHLEVEL的所有可能值,则可以将不同的ENGLISHLEVEL值的计数与ENGLISHLEVEL表中的值计数进行比较,这将告诉您哪些学生已完成所有课程。您还可以通过这种方式对每次培训进行此比较。