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

Posted

技术标签:

【中文标题】MS Access - 创建并填充包含由逗号分隔且没有重复值的连接文本的列【英文标题】:MS Access - create and populate column containing concatenated text separated by commas with no repeating values 【发布时间】:2021-09-27 12:05:08 【问题描述】:

我在 MS Access 中有两张表,一张是食品和关联公司:

FoodID Food Company
1 Apple Vino Farms
2 Orange Citrus Co.
3 Banana Vino Farms

还有一个关于某人是否吃过食物的信息

ClientID ClientName Apple Orange Banana
1 Bob Yes No Yes
2 Tyler Yes Yes Yes
3 Joe No No No

我想编写一个查询,创建一个由公司填充的列,该列生产某人报告吃的食物,用逗号分隔。如果有人报告说吃了同一家公司生产的不止一种食物,我只希望公司名称列出一次:

ClientID ClientName AssociatedCompanies
1 Bob Vino Farms
2 Tyler Vino Farms, Citrus Co.
3 Joe

任何帮助将不胜感激!

【问题讨论】:

首先规范化您的表格。客户表不是;食物表也不是,因为公司(供应商)应该是一个单独的表。完成后,您会发现任务很容易解决。 正如对您的其他问题 (***.com/questions/69337883/…) 的评论所建议的那样,规范化数据结构。然后可以使用相同的 VBA 程序。规范化意味着只有当客户吃了食物时才会有记录。 【参考方案1】:

正如 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 
)

注意以下相关点:

    您注意到,这仅适用于固定数量名称在查询中硬编码的公司。这是一个非常严重的限制。如果不满足这些限制,我建议您使用 TRANSFORM 查询,但是,您不会将公司作为单个文本字段,其值以逗号分隔,您宁愿将它们作为可变数量的字段,每个字段具有是/否值(类似于您当前的“吃食物”表)。 我假设“food”和“Company”的值都是其表中的候选键。否则,使用相应的 ID 字段,并使用内部连接获取实际值。 如果您想更好地了解将行转换为列的部分,您可以查看示例数据库中的查询“K_rows_into_columns_1”,该示例可从LightningGuide.net 下载。 您必须对用户定义的 VBA 函数“RemoveCommas()”进行编码,以从包含公司列表的字符串中删除不必要的逗号。如果不必要的逗号不打扰您,那么您可以在不编写此功能的情况下执行查询。 如果您想编写我上面建议的 TRANSFORM 替代方案,您可以从可从LightningGuide.net 下载的示例数据库中查看查询“K_rows_into_columns_2”。

【讨论】:

以上是关于MS Access - 创建并填充包含由逗号分隔且没有重复值的连接文本的列的主要内容,如果未能解决你的问题,请参考以下文章

MS-Access:在分隔符上拆分内容并与其他表连接

Ms Access SQL:连接用逗号分隔的一对多关系[重复]

MS-Access查询以在另一列中收集逗号分隔的结果

需要 MS Access 数据库查询帮助

让 SQL 使用选择表单元素,逗号分隔

来自组合框的 MS Access Like 查询