设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1950|回复: 4
打印 上一主题 下一主题

[查询] 从某班级中取3人按矮中高排列变成表2,把所有的排列组合都弄出来

[复制链接]
跳转到指定楼层
1#
发表于 2015-12-30 08:02:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我把问题形象化,表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班

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2015-12-30 14:14:16 | 只看该作者
'执行代码前先引用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执行即可。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
3#
 楼主| 发表于 2015-12-30 22:14:27 | 只看该作者
谢谢版主答复。
结果非常好。

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

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

Access里没有递归查询,没法解决。
5#
 楼主| 发表于 2015-12-31 11:15:40 | 只看该作者
再次谢谢版主答复。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-4 22:17 , Processed in 0.092847 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表