【问题标题】:Access Query/VBA to Group from two fields and Concatenate values访问查询/VBA 以从两个字段和连接值进行分组
【发布时间】:2019-10-25 23:02:56
【问题描述】:

我正在尝试解决一个具有挑战性的问题,并且可以在这件事上利用您的专业知识。

我正在尝试使用从前端应用程序获取到 FootPrints Service Core 11.6 数据库的查询来复制 Access 2013 中的一些报告。我已完成查询和计算以复制前端报告中的大多数字段,但受让人信息除外。

(注意: 受让人是工单被分配到工作的个人或 [通常] 团队,可以是多个 [团队和个人 em>])

这些受让人在足迹数据库的受让人表中单独列出(参见附图)。当前端应用程序生成报告时,它以某种我无法模仿的特定方式将个人和团队受让人信息组合在一起(见图)。这就是我需要你帮助的地方!

我需要将所有受让人(个人和团队受让人)合并到一个字段中,按他们关联的票号 (mrID) 分组。

那么,数据库中哪里有以下内容

MrID |受让人 |团队

12345 | Bob Smith | 帮助台 1 级

12345 | Jane Smith | 帮助台 1 级

12345 |(空)|电信

23456 |(空)|帮助台第 2 层

34567 | Chuck Norris |(空)

45678 |(空)|帮助台第 1 层

45678 |(空)|帮助台第 2 层

45678 |(空)|网络

45678 |(空)|访问控制

它应该显示为 1 个字段,如下所示:

MrID |受让人

12345 | 第 1 层帮助台:Bob Smith、Jane Smith。电信:

23456 | 帮助台第 2 层:

34567 |查克·诺里斯

45678 | 帮助台第 1 层:。帮助台第 2 层:.联网: 。访问控制:

在上面的例子中可以看到,每个团队的受理人后面都有一个:,多个团队成员(个人)用,分隔,多个团队用.分隔

遵循这个约定 有没有办法通过在 Access 中使用查询(或必要时使用 VBA)来模拟这个过程?

此致,

克里斯

【问题讨论】:

  • 这样的问题对于 Stack Overflow 来说有点太宽泛了。这需要 VBA 解决方案,您可以搜索 ConcatRelated 的源代码并从中开始,或者从头开始编写,但我们并不是真正从事提示业务。
  • 最诚挚的歉意,埃里克!由于包含 PII,我无法提供数据集的副本。我试图在提供的屏幕截图中捕获相关的字段,我知道这很难解决。我认为可能有一个仅查询的解决方案,但认为很有可能需要 VBA 才能完成。

标签: sql vba ms-access group-by concatenation


【解决方案1】:

您没有提供足够的数据来进行更多测试。是的,您包含了屏幕截图,但要复制和粘贴的数据只有 3 条记录,所以我使用了它

我这样回复你的桌子(我的桌子的名字是Table1):

然后,我有一个这样的查询:

这个查询的 SQL 代码是:

SELECT DISTINCT Table1.MrID, FINAL_ASSIGNEES([mrid]) AS ASSIGNEES FROM Table1;

如您所见,此 SQL 代码调用了一个用 VBA 编码的 UDF,名为 FINAL_ASSIGNEES。这个UDF的代码是:

Public Function FINAL_ASSIGNEES(ByVal vThisMrID As Long) As String
Dim RST As Recordset
Dim SqlStr As String

SqlStr = "SELECT DISTINCT Table1.MrID, CONCATENATE_ASSIGNEE([MrID],[Team]) AS ASSIGNEES FROM Table1 " & _
    "WHERE Table1.MrID=" & vThisMrID & ";"

Set RST = Application.CurrentDb.OpenRecordset(SqlStr, 2, 4)

With RST
    If .EOF <> True And .BOF <> True Then
        .MoveLast
        .MoveFirst
        Do Until .EOF = True
            FINAL_ASSIGNEES = FINAL_ASSIGNEES & .Fields(1).Value & ". "
            .MoveNext
        Loop
            FINAL_ASSIGNEES = Left(FINAL_ASSIGNEES, Len(FINAL_ASSIGNEES) - 2) 'minus 2 to get rid of extra ". "
    End If

    Set RST = Nothing
End With


End Function

是的,这个 VBA 代码调用了名为 CONCATENATE_ASSIGNEE 的第二个 UDF。第二个UDF的代码是:

Public Function CONCATENATE_ASSIGNEE(ByVal vMrID As Long, ByVal vTeam As String) As String
Dim MyRST As Recordset
Dim MySQL As String

MySQL = "SELECT Table1.Assignee FROM Table1 " & _
    "WHERE (((Table1.MrID)=" & vMrID & ") AND ((Table1.Team)='" & vTeam & "'));"

Set MyRST = Application.CurrentDb.OpenRecordset(MySQL, 2, 4)
DoEvents

With MyRST
    If .EOF <> True And .BOF <> True Then
        .MoveLast
        .MoveFirst

        Do Until .EOF = True

            If IsNull(.Fields(0)) = True Then
                CONCATENATE_ASSIGNEE = CONCATENATE_ASSIGNEE & "Unassigned" & ", "
            Else
                CONCATENATE_ASSIGNEE = CONCATENATE_ASSIGNEE & .Fields(0).Value & ", "
            End If

            .MoveNext
            DoEvents
        Loop

        CONCATENATE_ASSIGNEE = vTeam & ": " & Left(CONCATENATE_ASSIGNEE, Len(CONCATENATE_ASSIGNEE) - 2) 'minus 2 to get rid of the extra ", "
    End If
    Set MyRST = Nothing
End With



End Function

但这就是你所追求的。如果您正在使用大型记录集,则可能需要一些时间来进行计算。但至少您可以根据自己的需要进行调整。

【讨论】:

  • 嗨狐火!我还没有机会对此进行测试,但我想花点时间感谢您在此回复中所做的巨大工作!对于无法提供更多可使用的实质性数据,我深表歉意,我只能提供数据集的屏幕截图,因为它包含 PII。曾经有一个很棒的数据模型可用于我从中提取的数据库,这里:(由于某种原因现在不可用)[链接](support.numarasoftware.com/support/docs/12/116/1/…
  • 忘记回答您关于数据集大小的问题。目前,数据集包含 553,532 条分配记录,涵盖日期从 2017 年 1 月 1 日到现在()。你的代码看起来很棒,我迫不及待地想测试一下。做完我会告诉你结果的! :)
  • 嘿,@FoxfireAndBurnsAndBurns,我已经完成了对代码的调整以适应我的确切表/字段名称,但是,我在 CONCATENATE_ASSIGNEE UDF 中遇到了错误。我收到运行时错误 13:Set MyRST = Application.CurrentDb.OpenRecordset(MySQL, 2, 4) 行上的类型不匹配
  • 阅读另一篇关于这些代码行不匹配的帖子可能表明引用存在问题。我尝试在工具菜单的引用中启用 Microsoft DAO 3.6 对象库,但无法加载(加载 DLL 消息时出错)。我不确定这是否是 Mismatch 错误的根本原因
  • 我能够通过在两个脚本中将 Dim MyRST As Recordset 更改为 Dim MyRST As DAO.Recordset 来运行它,但即使运行了一个月的数据它也没有完成(需要这么久)。可能是负载问题,也可能是脚本问题。
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多