查找SQL Server

时间:2018-04-23 19:04:41

标签: sql-server

首先,为我的语法道歉(英语不是我的第一语言)。

所以我一直坚持这个特殊的问题,我不知道如何解决它。我试过在谷歌和Youtube上搜索,无论在哪里,但似乎找不到任何有用的东西。我找不到一个有同样类型问题的问题,但如果之前有人问我,我道歉, - 我找不到任何东西。

所以我正在使用两张桌子。首先,我正在看表

学生

PERSON_ID   ENROLL_PERIOD   PROGRAM_TYPE_LETTER PROGRAM_TYPE_NAME   STUDENT_ID
-------------------------------------------------------------------------------
12401       109                 B               Bachelor            116901
15668       124                 B               Bachelor            147068
22671       132                 B               Bachelor            213071
22921       133                 B               Bachelor            215821

该表中还有其他几列,但它们与任务无关,所以我没有将它们包含在这里(它是一个相当大的表)。

除了另一张表, GRADES

PERSON_ID   GRADE   GRADE_DATE  GRADE_TYPE
-------------------------------------------
2308133      7      16-06-26        p         
2308133     10      18-01-24        p         
2308133      4      16-02-01        p         
2308133      7      15-06-29        p          

(这些只是表格中的一小部分)。我需要找到延迟最多的100名学生和没有延迟的100名学生的成绩数据。延迟学生是指已经注册了7个或更多学士学位和5个或更多学期硕士学位的学生。注册期显示学生注册的时间。例如,enroll_period 138表示该学生在2018年秋季学期注册。所以137是2018年春季学期,136是2017年秋季学期,135 = 2017年春季学期,依此类推。

到目前为止,我已经找到了100名最迟到的学生;

SELECT TOP 99 
    students.person_id, MIN(enroll_period) AS delayed 
FROM 
    students   
WHERE 
    enroll_period < '135' 
    AND program_type_letter = 'M' OR enroll_period < '133' 
    AND program_type_letter = 'b'  
GROUP BY 
    students.person_id 
ORDER BY 
    delayed

我也知道如何加入表并获得我想要的三列(person_id,enroll_period和grade),但我找不到找到100个特定person_ID的所有等级数据的方法。我的问题是,在学生表中,每个person_ID只出现一次。所以每行都有不同的person_ID。但是在成绩表中,每个person_ID都有很多行(不过特定学生的成绩很多)。

我似乎无法找到一种方法可以给我那些特定的100人_ID,同时允许他们为所有成绩“给予”几行。我希望我有道理。我是SQL Server的新手,所以我一直在尝试通过这个。我想出了如何使用完整的外连接来连接两个表,但是无法找到为我想要的100个person_ID拉出所有行的方法。至于现在,我已经决定手动完成;

SELECT TOP 4774 
    students.person_id, students.enroll_period, grade 
FROM 
    grades
FULL OUTER JOIN 
    students ON grades.person_id = students.person_id
WHERE 
    enroll_period < '135' 
    AND program_type_letter = 'M' OR enroll_period < '133' 
    AND program_type_letter = 'b' 
ORDER BY 
    students.enroll_period

通过手动我的意思是我通过查看我在第一个代码中找到的100个person_ID手动找到了所有4774行,只是在SELECT TOP号码中添加了越来越多的行,直到我到达最后一行的行尾100人_ID。我真的希望我在这里有意义。

我在网上找到的所有解决方案只能用于拉出一个特定值的所有行(如果我必须找到5个person_ID,这很酷,但是当我必须找到100个时,这个很酷),或者如果您需要从中抽出100行,例如第100行到第200行。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找这样的嵌套查询:

select * from (
SELECT TOP 99 
    students.person_id, MIN(enroll_period) AS delayed 
FROM 
    students   
WHERE 
    enroll_period < '135' 
    AND program_type_letter = 'M' OR enroll_period < '133' 
    AND program_type_letter = 'b'  
GROUP BY 
    students.person_id )a
left join grades b on a.person_id=b.person_id
相关问题