在包含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
我该怎么做?
答案 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
然后,您可以根据需要多次单击该按钮以构建您的选择。