Sql MS-Access基于条件的多值字段元素提取
我得到一个报告,其中有一个多值字段,其中包含用户角色和相应的用户信息。总共有6个角色,每行数据可以有多个人在同一个角色下操作。我正在使用MS Access 2013进行数据操作Sql MS-Access基于条件的多值字段元素提取,sql,ms-access,multivalue,Sql,Ms Access,Multivalue,我得到一个报告,其中有一个多值字段,其中包含用户角色和相应的用户信息。总共有6个角色,每行数据可以有多个人在同一个角色下操作。我正在使用MS Access 2013进行数据操作 ID Data Users 1 Data1 Supervisor (MICROSOFT OUTLOOK; microsoftoutlook@example.com 9999999999) Admin Assistant (WATER BOTTLE; waterbottle@example.com, 999
ID Data Users
1 Data1 Supervisor (MICROSOFT OUTLOOK; microsoftoutlook@example.com 9999999999) Admin Assistant (WATER BOTTLE; waterbottle@example.com, 9999999999) Analyst (GREEN BLUE; greenblue@example.com; 999999999)
2 Data2 Supervisor (COMPUTER MONITOR; computermonitor@example.com; 9999999999) Admin Assistant (MICROSOFT EXCEL; microsoftexcel@example.com, 9999999999) Analyst (GREEN BLUE; greenblue@example.com; 999999999); Analyst (ORANGE PURPLE; orangepurple@example.com; 999999991)
3 Data3 Supervisor (GREEN BLUE; greenblue@example.com; 9999999999) Admin (MICROSOFT ACCESS; microsoftaccess@example.com, 9999999999) Analyst (ORANGE PURPLE; orangepurple@example.com; 999999999); Analyst (YELLOW BLACK; yellowblack@example.com; 999999991)
上面是一个被截断和替换的数据集。在ID=2和3中,有2名分析师。可能有两个“行政助理”的情况。用户
的格式与所列格式完全相同。个人用户也可以跨多行列出,有时也可以在不同的角色下列出
我不一定需要将数据分开,但我确实需要根据data
列选择某些角色。如果Data
=[特定条件],则拉入特定的用户角色。例如,如果Data
=“Completed”,我需要提取该行的所有“Supervisors”。如果Data
=“进行中”,我需要提取该行的所有“分析师”。还有其他条件用于确定要拉入哪个角色和用户。我需要为该行提取用户角色和与该角色关联的用户。我想为“所有权角色”和“当前所有权”创建两个新列。“所有权角色”是用户角色,“当前所有权”应包含与该行的该角色关联的所有用户
如果您有任何问题或需要澄清,请告诉我。我感谢你抽出时间来读这篇文章
更新
我期望的结果如下
ID Data Ownership Role Current Ownership Users
1 Completed Supervisor MICROSOFT OUTLOOK Supervisor (MICROSOFT OUTLOOK; microsoftoutlook@example.com 9999999999) Admin Assistant (WATER BOTTLE; waterbottle@example.com, 9999999999) Analyst (GREEN BLUE; greenblue@example.com; 999999999)
2 In Progress Analyst GREEN BLUE, ORANGE PURPLE Supervisor (COMPUTER MONITOR; computermonitor@example.com; 9999999999) Admin Assistant (MICROSOFT EXCEL; microsoftexcel@example.com, 9999999999) Analyst (GREEN BLUE; greenblue@example.com; 999999999); Analyst (ORANGE PURPLE; orangepurple@example.com; 999999991)
3 Initiated Admin MICROSOFT ACCESS Supervisor (GREEN BLUE; greenblue@example.com; 9999999999) Admin (MICROSOFT ACCESS; microsoftaccess@example.com, 9999999999) Analyst (ORANGE PURPLE; orangepurple@example.com; 999999999); Analyst (YELLOW BLACK; yellowblack@example.com; 999999991)
更新2019-05-10
由于我没有正确地解释这个问题并建立一个样本数据集,我将根据6月7日的答案和一行样本数据发布这些案例
Case "Initiated"
strRole = "Main Admin Assistant"
Case "Drafted"
strRole = "Financial Analyst"
Case "Rated"
strRole = "Contractor Rep"
Case "Reviewed"
strRole = "Assessing Official"
Case "Finalized"
strRole = "Reviewing Official"
示例数据-这些数据都在Excel的1个单元格中,每个元素位于该单元格的不同行上。紧跟在右括号之后,我可以说没有空格,所以下一个用户角色立即开始
Supervisor (ERGO KB; ergokb@example.com; (999) 999-9999)Team Lead (WIDE SCREEN; widescreen@example.com; 9999999999)Team Rep (CELL PHONE; cellphone@example.com; 999-999-9999)Team Rep (CLICK PEN; clickpen@example.com; (999) 999-9999)Main Admin Assistant (WIRED MOUSE; wiredmouse@example.com; 999-999-9999)Main Admin Assistant (PHONE CHARGER; phonecharger@example.com; 9999999999)Financial Analyst (WATER BOTTLE; waterbottle@example.com; (999) 999-9999)Financial Analyst (CLEAR TAPE; cleartape@example.com; 999-999-9999)Human Resources (POST IT NOTE; postitnote@example.com; 999-999-9999)
对于下面的每个状态,我需要关联的用户角色
Status User Role
Initiated Main Admin Assistant
Drafted Financial Analyst
Rated Team Rep
Reviewed Financial Analyst
Finalized Human Resources
Completed Completed
实际预期结果
Status User Role Users
Initiated Main Admin Assistant WIRED MOUSE, PHONE CHARGER
Drafted Financial Analyst WATER BOTTLE, CLEAR TAPE
Rated Team Rep CELL PHONE, CLICK PEN
Reviewed Financial Analyst WATER BOTTLE, CLEAR TAPE
Finalized Human Resources POST IT NOTE
Completed Completed Completed
解析字符串时,结构的一致性非常关键。例如,在IDS2和ID3的最后两个元素之间有一个分号(后面),但在其他元素之后没有分号。额外的分号使编程逻辑复杂化。因为评论说分号是一种拼写错误,并且没有空格跟随),所以代码在结构上反映了这些更正 下面是一个让您开始的函数。将此过程放在通用模块中,可以从查询或文本框调用它
Function GetUsers(strData As String, strUsers As String) As String
Dim aryS As Variant, x As Integer, strRole As String, strNames As String
aryS = Split(strUsers, ")")
Select Case strData
Case "Initiated"
strRole = "Main Admin Assistant"
Case "Drafted"
strRole = "Financial Analyst"
Case "Rated"
strRole = "Team Rep"
Case "Reviewed"
strRole = "Financial Analyst"
Case "Finalized"
strRole = "Human Resources"
End Select
For x = 0 To UBound(aryS) - 1
If strRole = Left(aryS(x), InStr(aryS(x), "(") - 2) Then
strNames = strNames & Mid(aryS(x), InStr(aryS(x), "(") + 1, InStr(aryS(x), ";") - 1 - InStr(aryS(x), "(")) & ", "
End If
Next
If strNames <> "" Then GetUsers = Left(strNames, Len(strNames) - 2)
End Function
函数GetUsers(strData作为字符串,strUsers作为字符串)作为字符串
Dim aryS作为变量,x作为整数,strole作为字符串,strNames作为字符串
aryS=拆分(struser,“)”)
选择Case strData
案件“已启动”
strRole=“主要行政助理”
案件“已起草”
strole=“财务分析师”
案例“额定”
strRole=“团队代表”
案件“已审查”
strole=“财务分析师”
案件“定案”
strRole=“人力资源”
结束选择
对于x=0到UBound(aryS)-1
如果strRole=Left(aryS(x),InStr(aryS(x),“(”)-2),则
strNames=strNames&Mid(aryS(x),InStr(aryS(x),“(”)+1,InStr(aryS(x),“;”)-1-InStr(aryS(x),“(”)和“,”
如果结束
下一个
如果strNames“”则GetUsers=Left(strNames,Len(strNames)-2)
端函数
建议一个定义这些关联的表,而不是通过数据计算来确定角色。在查询中包括该表,然后将角色传递给函数而不是数据,这样就不需要案例块
修改代码以处理不一致的电话号码结构,该结构有时会导致以前的代码失败,以及类似角色名称的可能性(我可能一开始就应该这样做):
函数GetUsers(strData作为字符串,strUsers作为字符串)作为字符串
Dim strRole作为字符串,strNames作为字符串
选择Case strData
案件“已启动”
strRole=“主要行政助理(”
案件“已起草”
strRole=“财务分析师(”
案例“额定”
strRole=“团队代表(”
案件“已审查”
strRole=“财务分析师(”
案件“定案”
strRole=“人力资源部(”
案件“已完成”
strole=“财务分析师Jr(”
结束选择
当仪表(支架、支架)大于0
strUsers=Mid(strUsers,仪表(strUsers,strRole))
STRANMES=STRANMES和Mid(strUsers,仪表,“(”)+1,仪表,“;”)-Len(STRORLE)-1和“,”
strUsers=Mid(strUsers,2)
环
如果strNames“”则GetUsers=Left(strNames,Len(strNames)-2)
端函数
把所有的主管都拉进来是什么意思它的输出是什么?包含在论文中的主管的信息?只有电子邮件地址?整个用户
列的内容,如果它至少包含一个主管
?你说你不一定需要拆分,但我感觉你这样做是为了得到你想要的结果ts.也许你可以分享你的示例查询的期望结果SELECT@jnevil谢谢你的回复。我已经更新了我的原始帖子以包含期望的结果。我为“数据”添加了值列。我还没有包括其他列,但据我所知,此逻辑不需要它。根据Data
列中的值,我希望该特定角色的用户名。如果是多个用户,我希望它们之间用逗号和空格分隔。选择ID,Data,If(Data)=“Completed”、SUPERVISOR\u NAMES、IF(Data=“In Progress”、ANALYST\u NAMES、IF(Data=“Initiated”、ADMIN\u NAMES))
这将是伪逻辑。从何处派生“Owner”=“SUPERVISOR”和“In Progress”=“ANALYST”。是否有第二个表保存此关系,或者需要在SQL中定义此关系
Function GetUsers(strData As String, strUsers As String) As String
Dim strRole As String, strNames As String
Select Case strData
Case "Initiated"
strRole = "Main Admin Assistant ("
Case "Drafted"
strRole = "Financial Analyst ("
Case "Rated"
strRole = "Team Rep ("
Case "Reviewed"
strRole = "Financial Analyst ("
Case "Finalized"
strRole = "Human Resources ("
Case "Completed"
strRole = "Financial Analyst Jr ("
End Select
Do While InStr(strUsers, strRole) > 0
strUsers = Mid(strUsers, InStr(strUsers, strRole))
strNames = strNames & Mid(strUsers, InStr(strUsers, "(") + 1, InStr(strUsers, ";") - Len(strRole) - 1) & ", "
strUsers = Mid(strUsers, 2)
Loop
If strNames <> "" Then GetUsers = Left(strNames, Len(strNames) - 2)
End Function