我想在查询中连接一列中的字段。我在Microsoft Access中的表如下所示:
| Cluster1 | Cluster2 | Reason |
|-----------|------------|-----------|
| Cluster A | Cluster A1 | Reason 1 |
| Cluster A | Cluster A1 | Reason 2 |
| Cluster A | Cluster A2 | Reason 3 |
| Cluster A | Cluster A2 | Reason 4 |
| Cluster B | Cluster B1 | Reason 5 |
| Cluster B | Cluster B1 | Reason 6 |
| Cluster B | Cluster B1 | Reason 7 |
| Cluster B | Cluster B1 | Reason 8 |
| Cluster B | Cluster B1 | Reason 9 |
| Cluster B | Cluster B2 | Reason 10 |
我想在查询中实现的结果应如下所示:
| Cluster1 | Cluster2 | Reason |
|-----------|------------|----------------------------------------------|
| Cluster A | Cluster A1 | Reason1,Reason 2 |
| Cluster A | Cluster A2 | Reason3,Reason 4 |
| Cluster B | Cluster B1 | Reason 5,Reason 6,Reason 7,Reason 8,Reason 9 |
| Cluster B | Cluster B2 | Reason 10 |
我发现已经有一些类似的问题,但它们更简单,我可能不会根据我的情况调整它们。我了解到我必须使用Allen Browne的Concatenate VBA代码,并且我可以模仿一个更简单的例子。
Zacharey的解决方案非常适用于我的测试数据,但是当我尝试将它与我的真实数据一起使用时,它具有接近200,000条记录和5000主群集(cluster1),它永远不会结束计算。只有当我极度减少数据行的数量时,只过了一个字母的字母(比如A *),我得到2-4小时的结果。目前我开始由每个主群集手动运行它并将其添加到表中,但似乎没有效率。你知道如何加快速度吗?我假设创建一个过滤器(大约5000个,每个大约50个数据行),逐个处理每个主群集,然后运行查询,或创建临时表5000次,然后运行查询5000次,只有50行只会加快处理,但我从来没有这样做过。你有一个我可以尝试根据我的需要调整的示例代码吗?
SELECT Distinct
table.Cluster1,
table.Cluster2,
ConcatRelated("Reason", "table", "Cluster1=""" & [Cluster1] & """ and Cluster2=""" & [Cluster2] & """") AS Reasons
FROM table;
这对你有用吗?你确实需要使用Allen Browne的ConcatRelated
这是你的解决方案:
在MySQL中,您可以使用函数GROUP_CONCAT
轻松实现此目的。该代码如下所示:
select `Cluster 1`, `Cluster 2`, GROUP_CONCAT(`Reason`) as Reason
from test
group by `Cluster 1`, `Cluster 2`
在这里,您可以访问说明它的fiddle example链接。
在访问中你没有自然地拥有这个功能,但正如你在你的问题中写的那样,一个名叫Allen Browne的人做了一个自定义函数来实现同样的结果(link)。
在link中,您可以在How to use the function
部分中阅读明确的方法来实现它。您只需添加具有所提供功能的模块,编译并使用它。
我相信MySQL中的代码转换为MS Access中的相同解决方案将是:
SELECT test.[Custer 1], test.[Cluster 2], ConcatRelated("Reason","test", "test.[Custer 1]&test.[Cluster 2] = """ & test.[Custer 1]&test.[Cluster 2] & """") AS Reason
FROM test
GROUP BY test.[Custer 1], test.[Cluster 2];