Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql MS-Access基于条件的多值字段元素提取_Sql_Ms Access_Multivalue - Fatal编程技术网

Sql MS-Access基于条件的多值字段元素提取

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

我得到一个报告,其中有一个多值字段,其中包含用户角色和相应的用户信息。总共有6个角色,每行数据可以有多个人在同一个角色下操作。我正在使用MS Access 2013进行数据操作

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