Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

如何根据分数生成“考场”“考号”

xuexi  发表于:2011-09-29 18:04:03  
复制

如何根据分数生成“考场”“考号” [

 


各考场位置及人数
考场         位置         人数
1               416         40
2               417         56
3              418         56
4              419         56
5              422         56


学生成绩

     学号         姓名         分数

416  41623       严雨蒙     674

416  41601       范丽凤     673.5

417  41768       赵佳曦     673.5

416  41603       范韶迪     658

419  41944       马朋         657.5

418  41841       尤鹏杰     656

416  41636       吕思尧     655.5

419  41948       范雄杰     655.5



根据学生成绩,把第1名排在第1考场第1号,考场为“01”,考号为“01”,第2名考场为“01”考号为“02”,……,第1考场排满后排第2考场,依次类推。如果出现分数相同的,两个人,比如范丽凤和赵佳曦,谁靠前也无所谓。

严雨蒙的考场、考号分别为:01、01
范丽凤的考场、考号分别为:01、02
赵佳曦的考场、考号分别为:01、03
……

请高手指点,如何生成几千人的考场和考号?
点击下载此附件

 

Top
煮江品茶 发表于:2011-09-29 20:49:06
按分数排序(逆序),把学生塞入教室就可以了。

煮江品茶 发表于:2011-09-29 21:28:07

SELECT 学生.*, Val(DCount("*","学生","Format([分数],'000.00') & [学号]>=" & Format([分数],"000.00") & [学号])) AS 序号, IIf([序号]<=DLookUp("容纳人数","考场","ID=1"),1,IIf([序号]<=DSum("容纳人数","考场","ID<=2"),2,IIf([序号]<=DSum("容纳人数","考场","ID<=3"),3,IIf([序号]<=DSum("容纳人数","考场","ID<=4"),4,5)))) AS 考场, Format([考场],"00") & "_" & Format([序号],"000") AS 考号
FROM 学生
ORDER BY Val(DCount("*","学生","Format([分数],'000.00') & [学号]>=" & Format([分数],"000.00") & [学号]));

 

 

点击下载此附件

煮江品茶 发表于:2011-09-29 21:35:36

如果iif看得糊涂的话,也可以用Switch函数:

 

SELECT 学生.*, Val(DCount("*","学生","Format([分数],'000.00') & [学号]>=" & Format([分数],"000.00") & [学号])) AS 序号, Switch([序号]<=DLookUp("容纳人数","考场","ID=1"),1,[序号]<=DSum("容纳人数","考场","ID<=2"),2,[序号]<=DSum("容纳人数","考场","ID<=3"),3,[序号]<=DSum("容纳人数","考场","ID<=4"),4,[序号]<=DSum("容纳人数","考场","ID<=5"),5) AS 考场, Format([考场],"00") & "_" & Format([序号],"000") AS 考号
FROM 学生
ORDER BY Val(DCount("*","学生","Format([分数],'000.00') & [学号]>=" & Format([分数],"000.00") & [学号]));



xuexi 发表于:2011-09-29 23:04:28

非常感谢“煮江品茶”,谢谢!



xuexi 发表于:2011-09-29 23:08:51

我这里有20多个考场,我想按前辈的做法,语句是不是会很长?

好像你只解决了考场的问题,但没有按我的要求解决在这个考场内的“考号”即“座位号”的问题。

你能不能把您的方法再升级一下呢?

再次表示感谢!



dbaseIIIer 发表于:2011-09-30 00:20:29

必定是最佳答案!!!!!

那就不写那么多代码的! 用数据库的能力, 别让自己写错代码

 

为免写一个长查询那么复杂, 我把它分为三个, 直观很多的!

 

1。 为 “学生”表建个 ID 字段 类型为 “自动编号” 的。

 

2。 建   查询1

SELECT 考场.考场, 考场.位置, 考场.容纳人数, Sum(考场_1.容纳人数) AS 容纳人数之总计
FROM 考场, 考场 AS 考场_1
WHERE (((考场.ID)>=[考场_1].[ID]))
GROUP BY 考场.考场, 考场.位置, 考场.容纳人数;

3。 建   查询2

SELECT 查询1.考场, 查询1.位置, [容纳人数之总计]-[容纳人数]+1 AS [Begin], 查询1.容纳人数之总计 AS [End]
FROM 查询1;

4。 取得结果

SELECT 学生.ID, 学生.班, 学生.学号, 学生.姓名, 学生.分数, 查询2.考场, 查询2.位置
FROM 学生, 查询2
WHERE (((学生.ID) Between [begin] And [end]));

哪个学生 在哪个 考场, 一下子出来了!

全国考场一起执行也行!



煮江品茶 发表于:2011-09-30 08:41:50

按教室起编的考号查询:

 

SELECT 学生.*, Val(DCount("*","学生","Format([分数],'000.00') & [学号]>=" & Format([分数],"000.00") & [学号])) AS 序号, Switch(
[序号]<=DSum("容纳人数","考场","ID=1"),"01" & "_" & Format([序号],"00"),
[序号]<=DSum("容纳人数","考场","ID<=2"),"02" & "_" & Format([序号]-DSum("容纳人数","考场","ID=1"),"00"),
[序号]<=DSum("容纳人数","考场","ID<=3"),"03" & "_" & Format([序号]-DSum("容纳人数","考场","ID<=2"),"00"),
[序号]<=DSum("容纳人数","考场","ID<=4"),"04" & "_" & Format([序号]-DSum("容纳人数","考场","ID<=3"),"00"),
[序号]<=DSum("容纳人数","考场","ID<=5"),"05" & "_" & Format([序号]-DSum("容纳人数","考场","ID<=4"),"00"))
AS 考号
FROM 学生
ORDER BY Val(DCount("*","学生","Format([分数],'000.00') & [学号]>=" & Format([分数],"000.00") & [学号]));



煮江品茶 发表于:2011-09-30 10:32:55

如果教室多的话,可以用VB修改查询的方式解决:

 

 

点击下载此附件

 

 

Private Sub 分别考号_Click()
Dim rs As New ADODB.Recordset
Dim Qdef As QueryDef
Dim strname As String
Dim strsql As String
Dim i As Long
rs.Open "考场", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
strname = "连续考号查询"
Set Qdef = CurrentDb.QueryDefs(strname)

strsql = "SELECT *, Val(DCount('*','学生','Format([分数],''000.00'') & [学号]>=' & Format([分数],'000.00') & [学号])) AS 序号, Switch("
For i = 1 To rs.RecordCount
    strsql = strsql & "[序号]<=DSum('容纳人数','考场','考场<=" & i & "')," & i & ","
    rs.MoveNext
Next
strsql = Left(strsql, Len(strsql) - 1)
strsql = strsql & ") AS 考场, Format([考场],'00') & '_' & Format([序号],'000') AS 考号 "
strsql = strsql & "FROM 学生 "
strsql = strsql & "ORDER BY Val(DCount('*','学生','Format([分数],''000.00'') & [学号]>=' & Format([分数],'000.00') & [学号]))"
Qdef.SQL = strsql
Qdef.Close

rs.MoveFirst
strname = "考室起编考号查询"
Set Qdef = CurrentDb.QueryDefs(strname)
strsql = "SELECT *, Val(DCount('*','学生','Format([分数],''000.00'') & [学号]>=' & Format([分数],'000.00') & [学号])) AS 序号, Switch("
For i = 1 To rs.RecordCount
    strsql = strsql & "[序号]<=DSum('容纳人数','考场','考场<=" & i & "'),'" & Format(i, "00") & "_' & Format([序号]-nz(Dsum('容纳人数','考场','考场<=' & " & i - 1 & "),0),'00'),"
    rs.MoveNext
Next
strsql = Left(strsql, Len(strsql) - 1)
strsql = strsql & ") AS 考号 "
strsql = strsql & "FROM 学生 "
strsql = strsql & "ORDER BY Val(DCount('*','学生','Format([分数],''000.00'') & [学号]>=' & Format([分数],'000.00') & [学号]))"
Qdef.SQL = strsql
Qdef.Close

Set Qdef = Nothing
Me.连续考号子窗体.Form.Requery
Me.考室考号子窗体.Form.Requery
rs.clsoe
Set rs = Nothing
End Sub



xuexi 发表于:2011-09-30 14:23:47

煮江品茶,老师,谢谢您了!

 

您做的太好了!谢谢!



xuexi 发表于:2011-09-30 14:25:23
dbaseIIIer 老师,也谢谢您了,没给您最佳答案的一个原因是,您只生成了考场,您生成考场的方法我认为是非常好的,谢谢!

dbaseIIIer 发表于:2011-10-01 05:54:27

那就不写那么多代码的! 用数据库的能力, 别让自己写错代码

 

为免写一个长查询那么复杂, 我把它分为三个, 直观很多的!

 

1。 为 “学生”表建个 ID 字段 类型为 “自动编号” 的。

 

2。 建   查询1

SELECT 考场.考场, 考场.位置, 考场.容纳人数, Sum(考场_1.容纳人数) AS 容纳人数之总计
FROM 考场, 考场 AS 考场_1
WHERE (((考场.ID)>=[考场_1].[ID]))
GROUP BY 考场.考场, 考场.位置, 考场.容纳人数;

3。 建   查询2

SELECT 查询1.考场, 查询1.位置, [容纳人数之总计]-[容纳人数]+1 AS [Begin], 查询1.容纳人数之总计 AS [End]
FROM 查询1;

4。 取得结果

SELECT 学生.ID, 学生.班, 学生.学号, 学生.姓名, 学生.分数, 查询2.考场, 查询2.位置
FROM 学生, 查询2
WHERE (((学生.ID) Between [begin] And [end]));

 

哪个学生 在哪个 考场, 一下子出来了!全国考场一起执行也行!

 

是不是大家不明白我的查询? 根本就不需要 Choose, IIF, Switch  等表达式!

 

1. 是为考生建立一个排序的序列号

2及3. 是根据考场容纳人数 建一个表 含有

考场1  容纳40人  就是第 1-40序号的人去考

考场2  容纳56人  就是第 41-96序号的人去考

考场3  容纳56人  就是第 97-152序号的人去考

.....

4. 就是把 两个查询做一个比较, 便知道第几个考生去哪个考场了!

 

若真的是要个编号把 第4步骤改为

SELECT 学生.ID, 学生.班, 学生.学号, 学生.姓名, 学生.分数, 查询2.位置,

Format([查询2].[考场],"00") & "-" AS 考场号, Format([ID]-[Begin]+1,"00") AS 考号
FROM 学生, 查询2
WHERE (((学生.ID) Between [begin] And [end]));

不就是3个查询, 干吗搞得满成风雨的?



xuexi 发表于:2011-10-03 14:02:46
dbaseIIIer,谢谢了,你的三个查询好用!

总记录:12篇  页次:1/1 9 1 :