sql - 访问查询/VBA 以从两个字段和连接值进行分组
问题描述
我正在尝试解决一个具有挑战性的问题,并且可以在这件事上使用您的专业知识。
我正在尝试使用从前端应用程序获取到 FootPrints Service Core 11.6 数据库的查询来复制 Access 2013 中的一些报告。我已经完成了查询和计算,以复制前端报告中的大多数字段,但受让人信息除外。
(注: Assignee 是工单被分配到工作的个人或[一般]团队,可以是多个[团队和个人])
这些受让人在足迹数据库的受让人表中单独列出(见附图)。当前端应用程序生成报告时,它以某种我无法模仿的特定方式将个人和团队受让人信息组合在一起(见图)。这就是我需要你帮助的地方!
我需要将所有受让人(个人和团队受让人)组合在一个字段中,按他们关联的票号 ( mrID ) 分组。
那么,数据库中有以下内容的地方
身份证 | 受让人 | 团队
12345 | 鲍勃·史密斯| 帮助台第 1 层
12345 | 简·史密斯| 帮助台第 1 层
12345 | (空)| 电信
23456 | (空)| 帮助台第 2 层
34567 | 查克·诺里斯| (无效的)
45678 | (空)| 帮助台第 1 层
45678 | (空)| 帮助台第 2 层
45678 | (空)| 联网
45678 | (空)| 访问控制
它应该显示为 1 个字段,如下所示:
身份证 | 受让人
12345 | 帮助台第 1 层:鲍勃·史密斯、简·史密斯。电信:
23456 | 帮助台第 2 层:
34567 | 查克·诺里斯
45678 | 帮助台第 1 层:. 帮助台第 2 层:. 联网: 。访问控制:
在上面的例子中可以看到,每个团队的受理人后面都有一个:,多个团队成员(个人)用,分隔,多个团队用.'s分隔
遵循这个约定 有没有办法通过在 Access中使用查询(或必要时使用 VBA )来模拟这个过程?
真挚地,
克里斯
解决方案
您没有提供足够的数据来进行更多测试。是的,您包含了屏幕截图,但是要复制和粘贴的数据只有 3 条记录,所以我使用了它
然后,我有一个这样的查询:
此查询的 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 代码调用了第二个 UDF,名为CONCATENATE_ASSIGNEE
. 第二个 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
但这就是你所追求的。如果您正在使用大型记录集,则可能需要一些时间来进行计算。但至少您可以根据自己的需要进行调整。
推荐阅读
- javascript - 如何为特定用户发送浏览器通知?
- nginx - Kubernetes 中的集群内 nginx 代理(sidecar)重写标头
- java - 将 ical4j 添加到 maven jhipster 项目
- wordpress - 安装 SSL 证书后 Wordpress 菜单停止工作
- javascript - 将文本转换为其他格式
- java - 正则表达式识别多行文本中的连续和非连续重复词
- apache-kafka - Nifi:使用具有特定数量的分区/复制因子的 PublishKafka 创建 Kafka 主题
- scala - Scala,查找值是否在两个整数之间
- java - 如何将环境变量附加到 java clojure cli?
- google-sheets - 如何使用单元格的值并将其插入到引用工作表的公式中?