在 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 PATH
和STUFF
函数,链接可能会给你一些想法:***.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 连接行的主要内容,如果未能解决你的问题,请参考以下文章