当前位置: 首页 > 知识库问答 >
问题:

SQL统计学生在所有课程中的同班同学人数

廖弘伟
2023-03-14

我有以下表格:

  • 学生:学生ID(PK),学生姓名

我需要两个问题:

>

  • 为学生表中的每个学生id计算该学生在所有课程中的不同(唯一)同学总数的查询。如果学生未注册任何课程,则应返回0。

    例如,如果学生_ID 123参加了3门课程,并且每门课程都有10名不同的同学,我应该得到以下结果:

    Student_ID        Num_of_classmates
    -----------------------------------
    123               30
    

    返回所有学生及其所有同学的SQL查询。一个学生的同学是至少在同一个班级注册的另一个学生。

  • 共有2个答案

    麻茂材
    2023-03-14

    在这里,我只给出了第2部分的解决方案,因为@Gordon Linoff已经完成了第1部分),您也修复了-1问题。

    一点:在这里使用internaljoin而不是left join,以避免在同学姓名中使用NULL。希望这也能增加一点帮助:)

    测试数据集

    if object_id('tempdb..#Student') is not null drop table #Student;
    create table #Student (
        Student_ID int PRIMARY key,
        Student_Name varchar(50)
    )
    insert into #Student(Student_ID, Student_Name)
    values (1,'Alice'), (2,'Bob'),(3,'Claire'),(4,'Danny'),(5,'Eve'),(6,'Frank');
    
    if object_id('tempdb..#Course') is not null drop table #Course;
    create table #Course (
        Course_ID int PRIMARY key,
        Course_Name varchar(50)
    )
    insert into #Course(Course_ID, Course_Name)
    values (1,'Algorithm'), (2,'Bash'),(3,'Compiler'),(4,'Design Pattern'),(5,'Exception Handling');
    
    if object_id('tempdb..#Enrollment') is not null drop table #Enrollment;
    create table #Enrollment (
        Student_ID int,
        Course_ID int
    )
    insert into #Enrollment(Student_ID, Course_ID)
    values (1,1),(1,3),
           (2,2),(2,3),
           (3,3),(3,4),
           (4,1),(4,4),
           (5,1),
           (6,5);  -- This Frank guy has no classmate
    
    -- select * from #Student;
    -- select * from #Course;
    -- select * from #Enrollment;
    

    解决方案(2)

    select distinct
        A.Student_Name as Student_Name,
        D.Student_Name as Classmate_Name
    from #Student as A
    -- Student (A) -> Enrolled Courses (B)
    inner join #Enrollment as B  
        on A.Student_ID = B.Student_ID
    -- Enrollment Courses (B) -> Enrolled Students in that Course (C)
    inner join #Enrollment as C  
        on B.Course_ID = C.Course_ID
        and B.Student_ID <> C.Student_ID  -- exclude self
    -- Classmate's names
    inner join #Student as D
        on C.Student_ID = D.Student_ID
    order by Student_Name, Classmate_Name;
    

    输出

    注意:Frank没有同学,也没有显示空值。

    | Student_Name | Classmate_Name |
    |--------------|----------------|
    | Alice        | Bob            |
    | Alice        | Claire         |
    | Alice        | Danny          |
    | Alice        | Eve            |
    | Bob          | Alice          |
    | Bob          | Claire         |
    | Claire       | Alice          |
    | Claire       | Bob            |
    | Claire       | Danny          |
    | Danny        | Alice          |
    | Danny        | Claire         |
    | Danny        | Eve            |
    | Eve          | Alice          |
    | Eve          | Danny          |
    
    林俊英
    2023-03-14

    目前尚不清楚您想要以下哪一项:

    • 所有班级的学生总数(包括给定的学生)

    在任何情况下,基本上都是两种连接和聚合:

    select s.student_id,
           count(ec.student_id) as total_classmates,
           count(distinct s.student_id) as distinct_classmates,
           count(distinct case when ec.student_id <> s.student_id then ec.student_id end) as distinct_other_classmates
    from student s left join
         enrollment e
         on e.student_id = s.student_id left join
         enrollment ec
         on ec.class_id = e.class_id;
    group by s.student_id;
    
     类似资料:
    • 本文向大家介绍C语言学生成绩管理系统课程设计,包括了C语言学生成绩管理系统课程设计的使用技巧和注意事项,需要的朋友参考一下 学生成绩管理系统是比较适合初学者的。它涵盖了c语言几乎知识。对于学了c语言的人,把这个课程设计搞好(当然自己能设计出来是要有很好的基础)。不管自己能不能够完成,最重要的是能弄懂。参考其他资料,试着自己编写是不错的选择。这个课程设计也是我参照资料,自己编写的。自己适当地增加了一

    • 问题内容: 假设这样的3个表: teacher: student: class: 是否有SQL查询可为每位老师分配多少学生和班级? 结果应该是这样的: 问题答案: 尝试这样的事情:

    • 我想从db中获取学生列表,他们在每个班级中使用学生姓名获得最大人数。使用MySQL数据库。 我有如下表格,如学生、班级、成绩(不同年份的成绩) 表结构学生(student_id,student_name,class_id,地址),班级(class_id,class_name),结果(result_id,student_id,年份,分数) 我需要这样的清单

    • 我正在做一个学生注册数据库项目。学生注册课程并获得成绩。有时一个学生重复一门课程,获得更好的成绩。我需要只使用最好的成绩来计算grade_point和学分的总和。所以对于每个在不同学期重复课程的学生,我必须确定最高的成绩是多少。emplid代表学生,course_id标识一门课程,学分是学分hr,Grade_point是字母等级的数值,术语代表学期课程... 下面是一个我正在努力完成的例子。 OP

    • 在慕课堂左侧点击【学情统计】,可以查看慕课堂班级学生在当前课程中关于线下课堂和线上课程两个维度的统计数据。 线上课程数据 :包括了学生的平均学习进度及人数发布,提示:学情统计中的线上课程数据信息会隔天同步到慕课堂。 视频学习情况可以按照时间段查询每个视频的已学习和未学习的学生名单,并可以导出数据: 考核完成情况可以按照时间段查询已发布的测验,作业和考试的已学习和未学习的学生名单: 线下课堂数据 :

    • 必要条件 标准Python科学计算环境 (numpy, scipy, matplotlib) Pandas Statsmodels Seaborn 要安装Python及这些依赖,推荐下载Anaconda Python 或 Enthought Canopy, 如果你使用Ubuntu或其他linux更应该使用包管理器。 也可以看一下: Python中的贝叶斯统计 本章并不会涉及贝叶斯统计工具。适用于贝