使用 Access 数据库中 Excel 中的 SQL 连接行
Concatenating rows using SQL in Excel from Access Database
我有一个 Excel 2010 电子表格,它从 Access 数据库收集数据,我需要从中获取数据的 table 之一设置如下:
|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 但没有任何运气(也许我用错了它们?)。
其他可能有用的信息:
这个特定 table 上的数据库大约有 40,000 行数据。当我使用 Excel 2010 时,一些用户将使用 Excel 2007、2010、2013 和 2016。
有没有一种方法可以使用 SQL 或我可能没有想到的其他方法来实现基于 PaymentID 的 ClaimsID 行的串联?
提前致谢。
正常情况下 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
应该可以
对于可能遇到此问题的任何其他人,我最终无法获得 SQL 的工作方式,因此我不得不寻求一些不太优雅的方法。
我使用 SQL 拉取了数据,并在 Excel 数据 table 上添加了两个辅助列。在应用公式之前 - 确保数据排列在(以我为例)从低到高的 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() 数组公式将数据拉入另一个 table:
{=IFERROR(INDEX(Tablename[ClaimIDConCat],MATCH(1,([@RelatedID]=ClaimIDData[PaymentID])*("FinalRow"=Tablename[FinalRow]),0)),"N/A")}
这为我提供了整体所需的输出。
我有一个 Excel 2010 电子表格,它从 Access 数据库收集数据,我需要从中获取数据的 table 之一设置如下:
|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 但没有任何运气(也许我用错了它们?)。
其他可能有用的信息:
这个特定 table 上的数据库大约有 40,000 行数据。当我使用 Excel 2010 时,一些用户将使用 Excel 2007、2010、2013 和 2016。
有没有一种方法可以使用 SQL 或我可能没有想到的其他方法来实现基于 PaymentID 的 ClaimsID 行的串联?
提前致谢。
正常情况下 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
应该可以
对于可能遇到此问题的任何其他人,我最终无法获得 SQL 的工作方式,因此我不得不寻求一些不太优雅的方法。
我使用 SQL 拉取了数据,并在 Excel 数据 table 上添加了两个辅助列。在应用公式之前 - 确保数据排列在(以我为例)从低到高的 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() 数组公式将数据拉入另一个 table:
{=IFERROR(INDEX(Tablename[ClaimIDConCat],MATCH(1,([@RelatedID]=ClaimIDData[PaymentID])*("FinalRow"=Tablename[FinalRow]),0)),"N/A")}
这为我提供了整体所需的输出。