随机选择记录以创建有限记录

时间:2010-12-25 10:55:53

标签: ms-access random selection

在包含500名不同类别员工的Microsoft Access数据库中,我希望每个类别中只有一定数量的员工。例如,A类的2名雇员,B类的5名雇员,C类的8名雇员。

因此,我想创建10个单独的组,其中每个人只能在一个列表中找到,即不应该有重复的记录。每个报告应包含随机选择的唯一记录。一个列表中的一名员工应该在另一个列表中找到。

请帮助澄清如何实现?我尝试创建联合查询。但是,我只获得了重复记录的结果。我也试过随机限制表达但无济于事。优选地,分组应基于分配的中心。

数据库如下所示: -

Employee Name  Category  Duty As     Centre allotted 
1. XXXXX          A         I              1
2. XXXXX          A         I              1
3. XXXXX          B         II             1
4. XXXXX          B         II             1
5. XXXXX          B         II             1
6. XXXXX          C         III            1  
7. XXXXX          C         III            1  
8. XXXXX          C         III            1  
9. XXXXX          C         III            1  

我该怎么做?

2 个答案:

答案 0 :(得分:0)

这样的事情适合吗?

SELECT p.ID, p.EmpName, p.Category
FROM Persons P
WHERE p.ID In (
    SELECT Top 2 ID 
    FROM Persons 
    WHERE Category = "A" 
    ORDER BY Rnd(ID)+ID) 
OR p.ID In (
    SELECT Top 5 ID 
    FROM Persons 
    WHERE Category = "B" 
    ORDER BY Rnd(ID)+ID) 
OR p.ID In (
    SELECT Top 8 ID 
    FROM Persons 
    WHERE Category = "C" 
    ORDER BY Rnd(ID)+ID)
ORDER BY p.Category

答案 1 :(得分:0)

执行此操作的一种方法是向employees表中添加一个名为flag的字段,其中包含yes / no数据类型。然后创建一个包含以下控件的表单:

所有记录的复位标记为no的命令按钮

列出所有不同类别的组合框

用于存储要选择的记录数的文本框

另一个带有标记记录标题的命令按钮

然后点击事件VBA代码看起来如下所示:

    Private Sub cmdFlagRecords_Click()
    Dim lngRandomNumber As Long
    Dim k As Long
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    strSQLText = "Select * From Employees Where Category='" & Me.cboCategory & "'"
    Set rs = db.OpenRecordset(strSQLText, dbOpenSnapshot)
    k = 0
    Do Until k = CLng(Me.txtRecordsToSelect)
        ' generate a random number between one and the number of rows available
         lngRandomNumber = CLng(Rnd(1) * rs.RecordCount)
         'move to that record
         rs.AbsolutePosition = lngRandomNumber
         If Not rs![flag] Then
             ' set the flag to yes or true and increment the k variable
             db.Execute "Update Employees Set=True Where ID=" & rs![ID]
             k = k + 1
         End If
    Loop
    rs.Close

End Sub

然后,您可以根据需要多次单击该按钮以构建您的选择。