求一个不同班级人对应不同成绩等级的查询!

¥小添添¥ 2020-06-22 09:00:07
不同班级的同学,成绩对应不同等级,且不同等级的数量还不同,求一个查询方法,先感谢各位大神了。如1班分 90分优秀,80分良好,70中等,60分及格四挡,2班分,85分良好,60及格两档。
有表如下,简易的表,如果需要辅助列可以随便加的。
人员表
eid score did
人员的id 获得的分数 对应的班级id
1 90 1
2 80 1
3 72 1
4 90 2
5 80 2
6 72 2
等级表
id score title
班级id 分数 等级名称
1 90 优秀
1 80 良好
1 70 中等
1 60 及格
2 85 良好
2 60 及格
...全文
326 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
¥小添添¥ 2020-06-28
  • 打赏
  • 举报
回复
感谢各位,这个思路应该可行的。我去试下
吉普赛的歌 2020-06-28
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('dbo.[emp]') IS NOT NULL 
	DROP TABLE dbo.[emp]
GO
CREATE TABLE dbo.[emp](
[eid] INT
,[score] INT
,[did] INT
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[emp] VALUES(N'1',N'90',N'1')
INSERT INTO dbo.[emp] VALUES(N'2',N'80',N'1')
INSERT INTO dbo.[emp] VALUES(N'3',N'72',N'1')
INSERT INTO dbo.[emp] VALUES(N'4',N'90',N'2')
INSERT INTO dbo.[emp] VALUES(N'5',N'80',N'2')
INSERT INTO dbo.[emp] VALUES(N'6',N'72',N'2')
GO
IF OBJECT_ID('dbo.[lev]') IS NOT NULL 
	DROP TABLE dbo.[lev]
GO
CREATE TABLE dbo.[lev](
[did] INT
,[score] INT
,[title] NVARCHAR(10)	
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[lev] VALUES(N'1',N'90',N'优秀')
INSERT INTO dbo.[lev] VALUES(N'1',N'80',N'良好')
INSERT INTO dbo.[lev] VALUES(N'1',N'70',N'中等')
INSERT INTO dbo.[lev] VALUES(N'1',N'60',N'及格')
INSERT INTO dbo.[lev] VALUES(N'2',N'85',N'良好')
INSERT INTO dbo.[lev] VALUES(N'2',N'60',N'及格')
------ 以上为测试表及测试数据 --------

SELECT emp.*,f.title
FROM emp OUTER APPLY (
	SELECT TOP 1 lev.title FROM dbo.lev WHERE emp.did=lev.did AND emp.score>=lev.score ORDER BY lev.score DESC
) AS f
/*
eid	score	did	title
1	90	1	优秀
2	80	1	良好
3	72	1	中等
4	90	2	良好
5	80	2	及格
6	72	2	及格
*/

向阳的花儿 2020-06-22
  • 打赏
  • 举报
回复
查询结果
向阳的花儿 2020-06-22
  • 打赏
  • 举报
回复
联合查询,取大于等级分数中最大的那个等级就可以了(按人分组,order by 等级分数降序,取第一个)
create table students(sid int ,score int,did int )
insert into students 
select 1,90,1
union 
select 2,80,1
union
select 3,72,1
union
select 4,90,2
union
select 5,80,2
union
select 6,72,2

 create table degres(id int ,score int,title varchar(20))
insert into degres
select 1,90,'优秀'
union 
select 1,80,'良好'
union 
select 1,70,'中等'
union 
select 1,60,'及格'
union 
select 2,85,'良好'
union 
select 2,60,'及格'

select a.sid,a.score,a.did,a.title from (
select s.*,d.title ,
row_number() over(partition by s.sid order by d.score desc) as n
from students as s
left join degres as d on s.did=d.id
where s.score>=d.score
)as a where n=1

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧