Office中国论坛/Access中国论坛

标题: 从某班级中取3人按矮中高排列变成表2,把所有的排列组合都弄出来 [打印本页]

作者: bfwz    时间: 2015-12-30 08:02
标题: 从某班级中取3人按矮中高排列变成表2,把所有的排列组合都弄出来
我把问题形象化,表1是一个班级同学的身高,从矮到高。想从中取3人按矮中高分别写入字段(身高矮、身高中、身高高)的每行中变成表2(只要每行字段1中的身高矮、字段2中、字段3高即可,不与其他行对比),把所有的排列组合都弄出来。

表1
身高
A1
A2
...
An

如果班级有5人,则

表2
身高矮        身高中        身高高
A1                A2                A3
A1                A2                A4
A1                A2                A5
A1                A3                A4
A1                A3                A5
A1                A4                A5
A2                A3                A4
A2                A3                A5
A2                A4                A5
A3                A4                A5
B1                B2                B3

如果班级有n人,
则字段1范围是Ai,i=1到n-2
则字段2范围是Aj,j=i+1到n-1
则字段3范围是Ak,k=j+1到n


进一步,
Ai是A班同学身高,Bi是B班同学身高,Ci是C班同学身高,
按照上述排法,怎样把表1变成表2

谢谢!

表1
身高        班级       
A1        A班       
A2        A班       
A3        A班       
A4        A班       
A5        A班       
B1        B班       
B2        B班       
B3        B班       
C1        C班       
C2        C班       
C3        C班       
C4        C班       
C5        C班       
C6        C班       

表2       
身高矮        身高中        身高高        班级
A1                A2                A3                A班
A1                A2                A4                A班
A1                A2                A5                A班
A1                A3                A4                A班
A1                A3                A5                A班
A1                A4                A5                A班
A2                A3                A4                A班
A2                A3                A5                A班
A2                A4                A5                A班
A3                A4                A5                A班
B1                B2                B3                B班
C1                C2                C3                C班
C1                C2                C4                C班
C1                C2                C5                C班
C1                C2                C6                C班
C1                C3                C4                C班
C1                C3                C5                C班
C1                C3                C6                C班
C1                C4                C5                C班
C1                C4                C6                C班
C1                C5                C6                C班
C2                C3                C4                C班
C2                C3                C5                C班
C2                C3                C6                C班
C2                C4                C5                C班
C2                C4                C6                C班
C2                C5                C6                C班
C3                C4                C5                C班
C3                C4                C6                C班
C3                C5                C6                C班
C4                C5                C6                C班


作者: roych    时间: 2015-12-30 14:14
'执行代码前先引用Microsoft ActiveX Data Object  2.8 Library
  1. Sub test()
  2.     Dim rst1 As New ADODB.Recordset
  3.     Dim rst2 As New ADODB.Recordset
  4.     Dim rst3 As New ADODB.Recordset
  5.     Dim i As Long, j As Long, k As Long
  6.     Dim Arr
  7.     rst1.Open "select distinct 班级 from 测试数据", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  8.     Do Until rst1.EOF
  9.         rst2.Open "select 姓名 from 测试数据 where 班级='" & rst1(0) & "'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  10.         rst3.Open "结果表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  11.         Arr = rst2.GetRows()
  12.         For i = 0 To UBound(Arr, 2)
  13.             For j = i + 1 To UBound(Arr, 2)
  14.                 For k = j + 1 To UBound(Arr, 2)
  15.                     rst3.AddNew
  16.                     rst3(0) = Arr(0, i)
  17.                     rst3(1) = Arr(0, j)
  18.                     rst3(2) = Arr(0, k)
  19.                     rst3(3) = rst1(0)
  20.                 Next
  21.             Next
  22.         Next
  23.         rst3.UpdateBatch
  24.         rst3.Close
  25.         rst2.Close
  26.         rst1.MoveNext
  27.     Loop
  28.     rst1.Close
  29. End Sub
复制代码

附上2007版本附件,如果你的是2003的话,请新建一个模块,把上述代码贴上,在VBE界面下,按下F5执行即可。
[attach]57761[/attach]
作者: bfwz    时间: 2015-12-30 22:14
谢谢版主答复。
结果非常好。

同样问题,Sql Server用查询解决了。
http://bbs.csdn.net/topics/391883340
我试着用查询在Access上实现,失败了。

请教版主,可否用查询在Access上实现?
作者: roych    时间: 2015-12-31 10:46
bfwz 发表于 2015-12-30 22:14
谢谢版主答复。
结果非常好。

Access里没有递归查询,没法解决。
作者: bfwz    时间: 2015-12-31 11:15
再次谢谢版主答复。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3