新生分班第5问,JiangHongTao已经很好的解答,但是还有一个问题很麻烦...

yezby20080306 2008-03-10 10:18:45
目的:新生分班
有一表TS:
编号 姓名 性别 年级 班级 总分
1 AA 女 未分班 620
2 BB 男 未分班 310
3 CC 男 未分班 420
4 DD 女 未分班 325
5 EE 女 未分班 190
6 EW 女 未分班 590
7 EW 女 未分班 593
...
有一表TC:
编号 年级 班级
1 初一 1班
1 初一 2班
1 初一 3班
...
条件:
1,表TC的用户添加的班级(动态);
2,分班原则:按总分字段分班即:1班分得一个最高分,3班分得次高分,2班分得最低分;在下一批中:2班分得剩下的最高分,3班分得剩下的次高分,1班分得剩下的最低分(即首尾相连);
3,我是需要对TS表的记录进行UPDATE操作,不是生成一个新表!!!
____________________________
jianghongtao的解答:
create table student(总分 decimal(9,2),姓名 varchar(12),年级 varchar(12),班级 varchar(12))
insert into student values(1101,'AA','未分班',null)
insert into student values(1102,'BB','未分班',null)
insert into student values(1103,'CC','未分班',null)
insert into student values(110,'DD','未分班',null)
insert into student values(110,'EE','未分班',null)
insert into student values(1106,'FF','未分班',null)
insert into student values(1107,'GG','未分班',null)
insert into student values(1108,'ES','未分班',null)
insert into student values(1109,'II','未分班',null)
insert into student values(1110,'AS','未分班',null)
insert into student values(1111,'QW','未分班',null)
insert into student values(1112,'PS','未分班',null)
insert into student values(1113,'UY','未分班',null)
create table class(年级 varchar(12),班级 varchar(12))
insert into class values('2008级','1班')
insert into class values('2008级','2班')
insert into class values('2008级','3班')
update f set 年级=g.nj,班级 = g.bj
from student f,(select xh,nj,bj from
(select a.总分 as xh,(select count(*) from student where 总分<a.总分 and 班级 = '未分班') as xhxh from student a where 班级='未分班') c,
(select b.年级 as nj,b.班级 as bj,(select count(*) from class where 年级+班级<b.年级+b.班级) as bjxh from class b ) d,
(select count(*) as zs from class) e
where (xhxh%(2*zs)= bjxh or xhxh%(2*zs)-2*(xhxh%zs) -1 = bjxh)) g
where f.总分=xh and f.班级= '未分班'
select * from student order by 总分
drop table student,class
_________________________________
总分没有重复时是没有问题的,当总分有重复时,分班就有问题(总分相同的班级是相同的),怎么解决这个问题?
...全文
173 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2008-03-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yezby20080306 的回复:]
TO DAWUGUI:
谢谢!
有个问题:班级表TC的用户添加的班级是动态的;
[/Quote]

这个不行吧.

除非你的表改为这样:
有一表TC:
编号 年级 班级
1 初一 1班
3 初一 2班
2 初一 3班

然后通过px%(select count(*) from tc)的取值和编号对应才行.
dawugui 2008-03-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yezby20080306 的回复:]
当总分相同的时候再按编号排序可能是一个好的办法.我想怎样把这个想法加到jianghongtao的SQL语句中?
[/Quote]

我在8楼不是已经写了语句了?
yezby20080306 2008-03-10
  • 打赏
  • 举报
回复
当总分相同的时候再按编号排序可能是一个好的办法.我想怎样把这个想法加到jianghongtao的SQL语句中?
yezby20080306 2008-03-10
  • 打赏
  • 举报
回复
TO DAWUGUI:
谢谢!
有个问题:班级表TC的用户添加的班级是动态的;
dawugui 2008-03-10
  • 打赏
  • 举报
回复
create table student(编号 int , 姓名 varchar(10) , 性别 varchar(10) , 年级 varchar(10) , 班级 varchar(10) , 总分 int) 
insert into student values(1, 'AA' , '女' , '' , '' , 620 )
insert into student values(2, 'BB' , '男' , '' , '' , 310 )
insert into student values(3, 'CC' , '男' , '' , '' , 420 )
insert into student values(4, 'DD' , '女' , '' , '' , 325 )
insert into student values(5, 'EE' , '女' , '' , '' , 190 )
insert into student values(6, 'EW' , '女' , '' , '' , 590 )
insert into student values(7, 'EW' , '女' , '' , '' , 593 )
go

--search
select 编号,姓名,性别,年级,总分,班级 = case px%3 when 1 then '1班' when 2 then '3班' else '2班' end from
(
select t.* , px = (select count(1) from student where 总分 > t.总分 or (总分 = t.总分 and 编号 > t.编号)) + 1 from student t
) m
/*
编号 姓名 性别 年级 总分 班级
----------- ---------- ---------- ---------- ----------- ----
1 AA 女 620 1班
2 BB 男 310 2班
3 CC 男 420 1班
4 DD 女 325 3班
5 EE 女 190 1班
6 EW 女 590 2班
7 EW 女 593 3班
(所影响的行数为 7 行)
*/

--update
update student
set 班级 = n.班级
from student , (select 编号,姓名,性别,年级,总分,班级 = case px%3 when 1 then '1班' when 2 then '3班' else '2班' end from
(
select t.* , px = (select count(1) from student where 总分 > t.总分 or (总分 = t.总分 and 编号 > t.编号)) + 1 from student t
) m
) n
where student.编号 = n.编号
select * from student
/*
编号 姓名 性别 年级 班级 总分
----------- ---------- ---------- ---------- ---------- -----------
1 AA 女 1班 620
2 BB 男 2班 310
3 CC 男 1班 420
4 DD 女 3班 325
5 EE 女 1班 190
6 EW 女 2班 590
7 EW 女 3班 593

(所影响的行数为 7 行)
*/
drop table student
dawugui 2008-03-10
  • 打赏
  • 举报
回复
--search
select 编号,姓名,性别,年级,总分,班级 = case px%3 when 1 then '1班' when 2 then '3班' else '2班' end from
(
select t.* , px = (select count(1) from student where 总分 > t.总分 or (总分 = t.总分 and 编号 > t.编号)) + 1 from student t
) m

--update
update student
set 班级 = n.班级
from student , (select 编号,姓名,性别,年级,总分,班级 = case px%3 when 1 then '1班' when 2 then '3班' else '2班' end from
(
select t.* , px = (select count(1) from student where 总分 > t.总分 or (总分 = t.总分 and 编号 > t.编号)) + 1 from student t
) m
) n
where student.编号 = n.编号
dawugui 2008-03-10
  • 打赏
  • 举报
回复

--search
select 编号,姓名,性别,年级,总分,班级 = case px%3 when 1 then '1班' when 2 then '3班' else '2班' end from
(
select t.* , px = (select count(1) from student where 总分 > t.总分 or (总分 = t.总分 and 编号 > t.编号)) + 1 from student t
) m
dawugui 2008-03-10
  • 打赏
  • 举报
回复
总分相同的班级是相同的

相同的时候再按姓名(或编号)排序,可否?

dawugui 2008-03-10
  • 打赏
  • 举报
回复
总分相同的班级是相同的

如何分班?
dawugui 2008-03-10
  • 打赏
  • 举报
回复
1班分得一个最高分,3班分得次高分,2班分得最低分;在下一批中:2班分得剩下的最高分,3班分得剩下的次高分,1班分得剩下的最低分(即首尾相连);

--

一个排名不就解决了?
dawugui 2008-03-10
  • 打赏
  • 举报
回复
看看.
pt1314917 2008-03-10
  • 打赏
  • 举报
回复
很好,顶``
yezby20080306 2008-03-10
  • 打赏
  • 举报
回复
结了再开一帖,看看
yezby20080306 2008-03-10
  • 打赏
  • 举报
回复
谢谢,测试了,还有问题,这个问题看来很难的,那么有什么办法把一个表中的一个字段如总分相同的依次加0.01,是总分都不相同?呵呵,就是保证总分没有相同的!
dawugui 2008-03-10
  • 打赏
  • 举报
回复
--来个同分,你看看结果对不对?
create table ts(编号 int , 姓名 varchar(10) , 性别 varchar(10) , 年级 varchar(10) , 班级 varchar(10) , 总分 int)
insert into ts values(1, 'AA' , '女' , '' , '' , 620 )
insert into ts values(2, 'BB' , '男' , '' , '' , 310 )
insert into ts values(3, 'CC' , '男' , '' , '' , 420 )
insert into ts values(4, 'DD' , '女' , '' , '' , 325 )
insert into ts values(5, 'EE' , '女' , '' , '' , 190 )
insert into ts values(6, 'EW' , '女' , '' , '' , 590 )
insert into ts values(7, 'EW' , '女' , '' , '' , 593 )
insert into ts values(8, 'FW' , '女' , '' , '' , 593 )
create table tc(编号 int,年级 varchar(10) , 班级 varchar(10))
insert into tc values(1, '初一', '1班')
insert into tc values(3, '初一', '2班')
insert into tc values(2, '初一', '3班')
go

--查询
select m.编号,m.姓名,m.性别,n.年级,n.班级,m.总分 from
(
select t.* , px = (((select count(1) from ts where 总分 > t.总分 or (总分 = t.总分 and 编号 > t.编号)) + 1)-1)% (select count(*) cnt from tc) from ts t
) m,tc n
where m.px = n.编号 - 1

--更新
update ts
set 年级 = o.年级,班级 = o.班级
from ts,(select m.编号,m.姓名,m.性别,n.年级,n.班级,m.总分 from
(
select t.* , px = (((select count(1) from ts where 总分 > t.总分 or (总分 = t.总分 and 编号 > t.编号)) + 1)-1)% (select count(*) cnt from tc) from ts t
) m,tc n
where m.px = n.编号 - 1
) o
where ts.编号 = o.编号

select * from ts

drop table ts,tc

/*编号 姓名 性别 年级 班级 总分
----------- ---------- ---------- ---------- ---------- -----------
1 AA 女 初一 1班 620
2 BB 男 初一 1班 310
3 CC 男 初一 3班 420
4 DD 女 初一 2班 325
5 EE 女 初一 3班 190
6 EW 女 初一 1班 590
7 EW 女 初一 2班 593
8 FW 女 初一 3班 593

(所影响的行数为 8 行)
*/
dawugui 2008-03-10
  • 打赏
  • 举报
回复
create table ts(编号 int , 姓名 varchar(10) , 性别 varchar(10) , 年级 varchar(10) , 班级 varchar(10) , 总分 int) 
insert into ts values(1, 'AA' , '女' , '' , '' , 620 )
insert into ts values(2, 'BB' , '男' , '' , '' , 310 )
insert into ts values(3, 'CC' , '男' , '' , '' , 420 )
insert into ts values(4, 'DD' , '女' , '' , '' , 325 )
insert into ts values(5, 'EE' , '女' , '' , '' , 190 )
insert into ts values(6, 'EW' , '女' , '' , '' , 590 )
insert into ts values(7, 'EW' , '女' , '' , '' , 593 )
create table tc(编号 int,年级 varchar(10) , 班级 varchar(10))
insert into tc values(1, '初一', '1班')
insert into tc values(3, '初一', '2班')
insert into tc values(2, '初一', '3班')
go

--查询
select m.编号,m.姓名,m.性别,n.年级,n.班级,m.总分 from
(
select t.* , px = (((select count(1) from ts where 总分 > t.总分 or (总分 = t.总分 and 编号 > t.编号)) + 1)-1)% (select count(*) cnt from tc) from ts t
) m,tc n
where m.px = n.编号 - 1
/*
编号 姓名 性别 年级 班级 总分
----------- ---------- ---------- ---------- ---------- -----------
1 AA 女 初一 1班 620
2 BB 男 初一 2班 310
3 CC 男 初一 1班 420
4 DD 女 初一 3班 325
5 EE 女 初一 1班 190
6 EW 女 初一 2班 590
7 EW 女 初一 3班 593

(所影响的行数为 7 行)
*/

--更新
update ts
set 年级 = o.年级,班级 = o.班级
from ts,(select m.编号,m.姓名,m.性别,n.年级,n.班级,m.总分 from
(
select t.* , px = (((select count(1) from ts where 总分 > t.总分 or (总分 = t.总分 and 编号 > t.编号)) + 1)-1)% (select count(*) cnt from tc) from ts t
) m,tc n
where m.px = n.编号 - 1
) o
where ts.编号 = o.编号

select * from ts
/*
编号 姓名 性别 年级 班级 总分
----------- ---------- ---------- ---------- ---------- -----------
1 AA 女 初一 1班 620
2 BB 男 初一 2班 310
3 CC 男 初一 1班 420
4 DD 女 初一 3班 325
5 EE 女 初一 1班 190
6 EW 女 初一 2班 590
7 EW 女 初一 3班 593

(所影响的行数为 7 行)
*/

--drop table ts,tc
yezby20080306 2008-03-10
  • 打赏
  • 举报
回复
TO DAWUGUI:
除非你的表改为这样:
有一表TC:
编号 年级 班级
1 初一 1班
3 初一 2班
2 初一 3班

然后通过px%(select count(*) from tc)的取值和编号对应才行.
______________________
TC表就是这样的啊:
表TC:
编号 年级 班级
1 初一 1班
3 初一 2班
2 初一 3班
TC是动态的,总分有相同时也能正常分班,你给我一个完整的SQL好吗 ?谢过!
内容概要:本文系统介绍了基于Matlab构建的简化单粒子(SPM)电化学模型及其参数化方法,聚焦于锂离子电池的降阶电化学模型P2D的简化实现,涵盖模型建立、参数辨识、测试数据提供及仿真验证全流程。资源核心在于深入剖析电化学模型的关键参数提取与优化过程,帮助科研人员理解电池内部反应机理与数学建模范式,支持后续的模型扩展与工程应用。文档不仅提供了完整的SPM模型代码与参数拟合工具,还整合了丰富的科研辅助资源,包括智能优化算法、机器学习、电力系统管理、路径规划、信号处理等多个领域的Matlab/Simulink仿真案例与Python实现方案,极大拓展了该模型在电池健康状态(SOH)估计、寿命预测、充放电控制策略等方向的应用潜力。; 适合人群:具备一定Matlab编程能力,从事新能源技术、电化学建模、电池管理系统(BMS)、储能控制、自动化仿真等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①开展锂离子电池电化学模型的建模与参数辨识研究;②实现P2D与SPM降阶模型的仿真与实验验证;③结合实测数据进行模型参数拟合与精度优化;④拓展应用于电池老化分析、SOH估算、充放电策略设计及储能系统动态响应研究。; 阅读建议:建议读者按照文档结构循序渐进学习,重点研读SPM模型构建与参数辨识章节,结合所提供的测试数据与代码进行动手实践,并积极借鉴附带的智能算法与机器学习模块以提升模型鲁棒性与预测精度。

34,876

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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