【问题标题】:Concatenating field data into string via Access SQL通过 Access SQL 将字段数据连接成字符串
【发布时间】:2018-07-24 13:13:47
【问题描述】:

想象一下下表

ID | Name
----------
1  | Shaun
1  | Terrence
2  | Jessica

我需要根据ID来连接Name中的字符串数据

ID | Name
-----------
1  | Shaun, Terrence
2  | Jessica

我正在使用访问数据库。我在想我可以进行枢轴转换并尝试连接这些字段,但问题是很难动态循环遍历总字段数。有什么想法吗?

**编辑:顺序无关紧要,我只想根据 ID 与 连接,空格是分隔符。我正在使用来自 excel vba 的 ADO 连接调用此 sql 代码。

【问题讨论】:

  • 顺序重要吗?像“泰伦斯,肖恩”也可以吗?如果有 10 个 ID 具有相同的值怎么办?您是否只想连接具有相同 ID 的所有名称?请提供更多详细信息。
  • 所以 Erik 你是对的,这些绝对是适用的链接。问题是他们使用函数,但不幸的是我从 Excel ADO 连接到访问数据库调用这个 sql 代码。我将编辑我上面的问题以包含它。
  • 您没有回答我之前的问题,即您可能希望根据 ID 连接多少个值。如果超过 2 个,则需要编写一些 VBA 代码。

标签: sql ms-access


【解决方案1】:

这是我最近尝试旋转两列表的类似问题; MS Access convert and summarise two rows into columns with unique names

'Name' 是保留字,'ID' 通常是具有唯一编号的自动索引,因此我将您的列分别更改为 UserID 和 UserName。

在单个子查询中创建答案存在一些问题,所以我最终这样做了:

  1. 创建带索引的临时表:
SELECT t1.UserID, t1.UserName, 
    (SELECT COUNT(*) + 1 
     FROM Table1 t2 
     WHERE t1.UserID = t2.UserID and t2.UserName < t1.UserName) AS [Index]  
INTO Table1_indexed 
FROM Table1 AS t1;
  1. 创建一个临时交叉表:
TRANSFORM First(Table1_indexed.UserName) AS FirstOfUserName 
SELECT Table1_indexed.UserID FROM Table1_indexed 
GROUP BY Table1_indexed.UserID 
PIVOT Table1_indexed.Index;
  1. 连接名称字段
SELECT Table1_crosstab.UserID, Table1_crosstab.[1], Table1_crosstab.[2], 
       IIf([1] Is Not Null,[1]) & IIf([2] Is Not Null,", " & [2]) AS ConcatenatedName 
FROM Table1_crosstab;

如果您有两个以上的名称字段,您可以将连接查询调整为您期望的最大数量。

也许可以将这些步骤合并到一个查询中,但我还没有找到方法。

【讨论】:

  • 感谢您的回复。我正在使用转换进行类似的查询,问题确实归结为动态知道最大列数。鉴于这很可能是不可能的,那么最好只做一个最大数量的假设。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 2015-05-02
  • 2011-12-11
  • 2013-09-10
  • 1970-01-01
相关资源
最近更新 更多