从两个字段访问查询/ VBA以进行分组并连接值

时间:2019-06-11 13:41:54

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

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

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

注意:受让人是指分配工作票证的个人或[一般]团队,可以是多个[团队和个人])

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

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

因此,数据库中存在以下内容

MrID |受让人|团队

12345 | Bob Smith | 服务台第1层

12345 | 简·史密斯 | 服务台第1层

12345 | (空) | 电信

23456 | (空) | 帮助台2级

34567 | Chuck Norris | (空)

45678 | (空) | 帮助台1级

45678 | (空) | 帮助台2级

45678 | (无) | 联网

45678 | (空) | 访问控制

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

MrID |受让人

12345 | 帮助台方法1:Bob Smith,Jane Smith。电信:

23456 | 帮助台方法2:

34567 | 查克·诺里斯(Chuck Norris)

45678 | 帮助台方法1 :。服务台方法2 :。联网: 。访问控制:

在上面的示例中可以看到,每个团队受让人后跟一个:,多个团队成员( individuals )以分隔,而多个团队则以分隔。

遵循此约定,是否有一种方法可以通过在Access中使用查询(必要时使用或VBA )来模仿此过程?

此致

克里斯

A standard report, showing how the assignee field is grouped and concatenated

The Assignees Table of the Database, the way the assignee info is natively stored.  Note: Names blacked out for privacy reasons

The Assignees Table of the Database, the way the assignee info is natively stored.  Note: Names blacked out for privacy reasons

1 个答案:

答案 0 :(得分:1)

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

我这样回复了您的表格(表格名称为Table1): enter image description here

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

enter image description here

此查询的SQL代码为:

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

如您所见,此SQL代码调用以VBA编码的名为FINAL_ASSIGNEES的UDF。此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

但这可以满足您的需求。如果使用大型记录集,则可能需要一些时间进行计算。但是至少您可以使它适应您的需求。