SQL练习题-力扣题库-高频SQL50题-1280.学生们参加各科测试的次数

题目要求:

在这里插入图片描述

这个表可能包含重复数据(换句话说,在 SQL 中,这个表没有主键)。
学生表里的一个学生修读科目表里的每一门科目。
这张考试表的每一行记录就表示学生表里的某个学生参加了一次科目表里某门科目的测试。

查询出每个学生参加每一门科目测试的次数,结果按 student_id 和 subject_name 排序。

查询结构格式如下所示。

示例 1:
在这里插入图片描述

在这里插入图片描述

这个题目一开始掉入了坑里,没仔细看 直接把三张表连接起来。后来导致结果报错

    select  
          st.student_id ,
          st.student_name ,
          su.subject_name,
          count(1)
     from Subjects Su
left join Examinations   Ex  
       on su.subject_name  = ex.subject_name 
left join Students  st
       on st.student_id = ex.student_id 
group by st.student_id ,
        st.student_name ,
        su.subject_name
order by st.student_id ,
       st.student_name 

运行结果: 报错了
在这里插入图片描述
后来仔细思考了一下 应该用到笛卡尔(Cross)连接

直接用了最简单的方式 没写 cross

	   SELECT * 
	 	 FROM Students  A5,Subjects A6  
     	WHERE 1 = 1 

运行结果:
在这里插入图片描述

在此基础上 进行分组完善补充代码

正确答案:

SELECT  
       A1.STUDENT_ID student_id  ,
       A1.STUDENT_NAME student_name ,
       A1.SUBJECT_NAME subject_name  ,
       NVL(A2.ct,0) attended_exams 
  FROM (
		SELECT * 
	 	 FROM Students  A5,Subjects A6  
     	WHERE 1 = 1 ) A1 
 LEFT JOIN (SELECT student_id ,subject_name ,count(*) ct 
 			  FROM Examinations 
 		  GROUP BY  student_id ,subject_name) A2
        ON A1.student_id  = A2.student_id 
       AND A1.SUBJECT_NAME = A2.SUBJECT_NAME
  ORDER BY A1.STUDENT_ID,A1.SUBJECT_NAME

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值