在 Excel 中使用 Access 数据库中的 SQL 连接行

Posted

技术标签:

【中文标题】在 Excel 中使用 Access 数据库中的 SQL 连接行【英文标题】:Concatenating rows using SQL in Excel from Access Database 【发布时间】:2017-07-12 12:23:30 【问题描述】:

我有一个 Excel 2010 电子表格,它从 Access 数据库收集数据,我需要从中获取数据的表之一是这样设置的:

|UniqueID |  PaymentID | ClaimID |  
 1        | 1234       | 5556    |
 2        | 1234       | 5557    |
 3        | 1235       | 5558    |
 4        | 1236       | 5559    |
 5        | 1236       | 5560    |

我需要的是根据 PaymentID 将 ClaimID 连接到同一行,因此它应该如下所示:

|UniqueID    |  PaymentID | ClaimID     |  
|   1        | 1234       | 5556, 5557  |
|    2       | 1235       | 5558         
|    3       | 1236       | 5559, 5560  | 

我已经尝试过使用 VBA 代码进行此操作,但它的处理时间太长了。我已经尝试过 PowerQuery,它也可以工作,但其他业务没有安装它,所以从长远来看不会工作。我最后的想法是在连接选项中使用 SQL 来操作数据,但我不确定如何。我搜索并尝试了以下功能:ConcatADO、Concatlist、Stuff 和 Group_Concat,但没有任何运气(也许我用错了?)。

其他可能有用的信息: 在这个特定的表上,大约有 40,000 行数据来自数据库。当我使用 Excel 2010 时,一些用户将使用 Excel 2007、2010、2013 和 2016。

有没有一种方法可以使用 SQL 或我可能没有想到的其他方法来实现基于 PaymentID 的 ClaimsID 行的连接?

提前致谢。

【问题讨论】:

不熟悉access数据库,但是在sql server中,你可以使用FOR XML PATHSTUFF函数,链接可能会给你一些想法:***.com/questions/31211506/… Concatenate Rows in Microsoft Access的可能重复 嗨@LONG 感谢您的链接 - 我继续查看那里可用的内容,但到目前为止没有任何效果。 @Gustav 这不是您发布的问题的重复,因为我希望仅在 Excel 中进行连接,但由允许数据来自 Access 的 SQL 完成脱颖而出。不幸的是,我也不能使用 VBA,因为处理时间太长。 【参考方案1】:

在正常的 sql 中类似于: SELECT PaymentID , GROUP_CONCAT(ClaimID) GroupedName FROM table_name GROUP BY PaymentID

应该可以工作,在 Postgres SQl 中类似于:

SELECT PaymentID , array_agg(ClaimID) FROM table_name GROUP BY PaymentID

应该工作

【讨论】:

您好,感谢您的帮助,但两个选项都不起作用我收到错误消息:[Microsoft][ODBC Microsoft Access Driver] Undefined function 'array_agg' in expression.【参考方案2】:

对于可能遇到此问题的其他任何人,我最终无法让 SQL 工作,因此我不得不采用远不那么优雅的方法。

我使用 SQL 提取数据,并在 Excel 数据表中添加了两个帮助列。在应用公式之前 - 确保数据按(对于我的实例)PaymentID 顺序从低到高排列 - 在第一个助手(名为“ClaimIDConCat”)列中,我放置了这个公式:

=IF([@PaymentID]=OFFSET([@PaymentID],-1,0),OFFSET([@ClaimIDConCat],-1,0)&", "&[@ClaimID],[@ClaimID])

这为我提供了与付款相关的不断增长的 ID 列表。在第二个辅助列(名为“FinalRow”)中,我使用了这个公式:

=IF([@PaymentID]<>OFFSET([@PaymentID],1,0),"FinalRow","NotFinal")

这将简单地查看下面的行是否与当前行相同 - 如果相同,则将“NotFinal”放置在单元格中,如果使用“FinalRow”。

最后,我的最后一部分是使用简单的 INDEX() MATCH() 数组公式将数据拉入另一个表:

=IFERROR(INDEX(Tablename[ClaimIDConCat],MATCH(1,([@RelatedID]=ClaimIDData[PaymentID])*("FinalRow"=Tablename[FinalRow]),0)),"N/A")

这为我提供了所需的总体输出。

【讨论】:

以上是关于在 Excel 中使用 Access 数据库中的 SQL 连接行的主要内容,如果未能解决你的问题,请参考以下文章

[非常急!!!]excel引用access表中的相关字段

如何将access中的数据导出为EXCEL文件?

access中无法导入excel外部数据

为啥我的access不能导入excel中的数据

使用 Sharepoint 列表中的链接表从 Excel 执行 sql 到 Access

Access中VBA中excel文件中的VLookup