MS Access -创建并填充包含以逗号分隔的连接文本的列,且不包含重复值



我在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 
)

请注意以下相关要点:

  1. 这只适用于固定数字在查询中硬编码了名称的公司. 这是一个非常严重的限制。如果不满足这些限制,我建议您使用转换查询,但是,您不会将公司作为单个文本字段,其值由逗号分隔,而更愿意将它们作为可变数量的字段,每个字段具有Yes/No值(类似于当前的"吃的食物")。表)。
  2. 我假设"食物"的值和";Company"每个表中都有一个候选键。否则,使用相应的ID字段,并使用内部连接获得实际值。
  3. 如果您想更好地理解将行转换为列的部分,您可以查看查询" k_rows_into_columns_ "从LightningGuide.net下载的示例数据库中。
  4. 必须编写用户定义的VBA函数"RemoveCommas()"从包含公司列表的字符串中删除不必要的逗号。如果您不介意不必要的逗号,那么您可以在不编写此函数的情况下执行查询。
  5. 如果您想编写我上面建议的转换选项,您可以检查查询"K_rows_into_columns_2"从LightningGuide.net下载的示例数据库中。

最新更新