我在MS Access中有两个表,一个是食品和相关公司:
<表类>
FoodID
食品公司 tbody><<tr>1 苹果 酒农场 2橙色 柑橘有限公司 3 香蕉 酒农场 表类>
根据Gustav的建议,从规范你的"吃过的食物"开始。表格它应该看起来像:
1 Bob Apple
1 Bob Banana
2 Tyler Apple
2 Tyler Orange
2 Tyler Banana
然后用下面的查询得到你想要的:
-- Group companies into one field, sepparated with commas
SELECT ClientID, ClientName, RemoveCommas(Company1 & ", " & Company2 & ", " ... & CompanyN)
FROM
( -- Convert rows (records) into columns (fields)
SELECT ClientID, ClientName
, Max(Iif(Company="Vino Farms", "Vino Farms", Null)) AS Company1
, Max(Iif(Company="Citrus Co.", "Citrus Co.", Null)) AS Company2
, ...
, Max(Iif(Company="Last_company", "Last_company", Null)) AS CompanyN
FROM
(-- Replace food by its manufacturing company
SELECT DISTINCT ClientID, ClientName, Company
FROM
Table_ate_food_normalized AS Ate
INNER JOIN
Table_food AS Comp
ON Ate.Food = Comp.Food
)
GROUP BY ClientID, ClientName
)
请注意以下相关要点:
- 这只适用于固定数字在查询中硬编码了名称的公司. 这是一个非常严重的限制。如果不满足这些限制,我建议您使用转换查询,但是,您不会将公司作为单个文本字段,其值由逗号分隔,而更愿意将它们作为可变数量的字段,每个字段具有Yes/No值(类似于当前的"吃的食物")。表)。
- 我假设"食物"的值和";Company"每个表中都有一个候选键。否则,使用相应的ID字段,并使用内部连接获得实际值。
- 如果您想更好地理解将行转换为列的部分,您可以查看查询" k_rows_into_columns_ "从LightningGuide.net下载的示例数据库中。
- 必须编写用户定义的VBA函数"RemoveCommas()"从包含公司列表的字符串中删除不必要的逗号。如果您不介意不必要的逗号,那么您可以在不编写此函数的情况下执行查询。
- 如果您想编写我上面建议的转换选项,您可以检查查询"K_rows_into_columns_2"从LightningGuide.net下载的示例数据库中。