我在MS Access中有一个由项目组成的表格,还有另一个表格,其中销售人员与这些项目相关联。例如,项目"铅笔"可能有4个人把它卖掉了。一旦所有内容都出现在查询中,我就会这样:
item seller
pencil joe
pencil bob
pencil charles
pen john
eraser ruth
paper charles
我有一份报告表,我希望在一行中列出每件商品的卖家。有点像:
pencil: bob, joe, charles
pen: john
eraser: ruth
paper: charles
我想我可以找出一个解决方案,我从一个按项目名称过滤的查询语句中创建一个ADO Recordset对象,然后使用a为每个循环遍历记录并将名称输入到每个项目的连接字符串中。听起来很长的路要走。任何人都有更好的方法吗?
答案 0 :(得分:2)
您可以使用Allen Browne的ConcatRelated函数创建查询,以将每个项的卖方名称连接到一个单独的字段中。然后在报告的记录源中使用查询。
以下是查询的输出,您的示例数据存储在名为 YourTable 的表中:
item sellers
------ ------------------
eraser ruth
paper charles
pen john
pencil joe, bob, charles
SELECT
y.item,
ConcatRelated
(
"seller",
"YourTable",
"[item]='" & [y].[item] & "'"
) AS sellers
FROM YourTable AS y
GROUP BY y.item;
答案 1 :(得分:1)
Jet SQL本身不支持任何用于连接组的机制。
但是,您可以针对所有数据发出单个查询,并使用Scripting.Dictionary
(工具 - > 参考 - > 保留结果的Microsoft Scripting Runtime 。
Dim dict As New Scripting.Dictionary
Do Until rs.EOF
If Not dict.Exists(rs!item) Then dict(rs!item) = New Collection
dict(rs!item).Add rs!seller
rs.MoveNext
Loop
仍然存在从集合生成字符串的问题。我建议使用描述here中描述的两种方法之一来编写一个收集集合并返回字符串(在下面的示例中称为Join
)的函数。
完成后,您可以遍历字典中的键,并加入每个项目中的集合:
Dim key As Variant
For Each key In dict.Keys
Debug.Print key, ":", Join(dict(key), ",")
Next