用一堆If查询

时间:2018-08-29 00:02:16

标签: ms-access access-vba

我有一个查询字段,该字段为FuncID字段提供结果文本“已完成”或“未完成”。我需要使用IFF创建另一个表达式,该表达式根据使用以下公式完成的FuncID来表示其所在的运算符级别1-5

FuncID 1 
FuncID 2 
FuncID 3 
FuncID 4 
FuncID 5 
FuncID 6 
FuncID 7 
FuncID 8 

运算符1 = FuncID 1 FuncID 2必须完成

运算符2 = FuncID 1 AND 必须完成FuncID 2

运算符3 = 八(8)个FuncID中的四(4)个必须完成

运算符4 = 八(8)个FuncID中的六(6)个必须填写

运算符5 = 八(8)个FuncID中的八(8)个必须完成

ElegibleLevel: Iff[FuncID]=1 AND [Expr1] = 1,"OPERATOR 1",0,

Iff[FuncID]=1 OR [FuncID]=2 AND [Expr1] = 1,"OPERATOR 1",0,

Iff[FuncID]=1 AND [FuncID]=2 AND [Expr1] = 1,"OPERATOR 2",0,

Iff(Count[FuncID]=3) = 4 AND [Expr1] = 1,"OPERATOR 3",0,

Iff(Count[FuncID]=4) = 6 AND [Expr1] = 1,"OPERATOR 4",0,

Iff(Count[FuncID]=5) = 8 AND [Expr1] = 1,"OPERATOR 5",0,

2 个答案:

答案 0 :(得分:0)

我建议使用与此数据库模式类似的数据库模式(简化):

enter image description here

要确定员工的操作员级别,我们只需为每个员工计算2个数字:

  • 所有8种可能功能中已分配功能的数量
  • 仅前2个功能中分配的功能数量

其中第一个是您的CountOfReqCompleted。两者都可以使用以下查询来计算:

EmployeesFunctionsAll:

SELECT EmployeesFunctions.EmployeeID,
  Count(EmployeesFunctions.FuncID) AS FunctionsCount
FROM EmployeesFunctions
GROUP BY EmployeesFunctions.EmployeeID;

EmployeesFunctionsBasic:

SELECT EmployeesFunctions.EmployeeID,
  Count(EmployeesFunctions.FuncID) AS FunctionsCount
FROM EmployeesFunctions
WHERE (((EmployeesFunctions.FuncID) In (1,2)))
GROUP BY EmployeesFunctions.EmployeeID;

最后,要计算每位员工的操作员级别,我们可以使用LEFT JOIN将这2个查询加入到 Employees 表中,这样“所有记录的“员工”被归还”。除了嵌套多个Iif函数之外,我们可以使用Switch函数来完成任务:

SELECT Employees.EmployeeID, Employees.EmployeeName, 
  Switch(
    EmployeesFunctionsAll.FunctionsCount >= 8, "Operator 5",
    EmployeesFunctionsAll.FunctionsCount >= 6, "Operator 4",
    EmployeesFunctionsAll.FunctionsCount >= 4, "Operator 3",
    EmployeesFunctionsBasic.FunctionsCount >= 2, "Operator 2",
    EmployeesFunctionsBasic.FunctionsCount >= 1, "Operator 1"
  ) AS OperatorLevel
FROM (Employees LEFT JOIN EmployeesFunctionsAll 
  ON Employees.EmployeeID = EmployeesFunctionsAll.EmployeeID) 
LEFT JOIN EmployeesFunctionsBasic 
  ON Employees.EmployeeID = EmployeesFunctionsBasic.EmployeeID;

答案 1 :(得分:0)

我现在正在调用一个函数,该函数将能够基于计数来判断我是否根据查询结果而不是所有Iffs完成了要求。

Function SetLevel(lngFuncID As Long, lngEmpID As Long, varDateCompleted As Variant)

  Dim lngPosID As Long
  Dim lngEmpPosID  As Long
  Dim strSQL As String
  Dim strCriteria As String

  strCriteria = "EmpID = " & lngEmpID

  If DCount("*", "qryMetalShopEmployeeFunctions", strCriteria) = 8 Then
      lngPosID = DLookup("PosID", "tblMetalShopLevel", "Position = ""Operator 5""")

  ElseIf DCount("*", "qryMetalShopEmployeeFunctions", strCriteria) = 7 Then
      lngPosID = 0

  ElseIf DCount("*", "qryMetalShopEmployeeFunctions", strCriteria) = 6 Then
      lngPosID = DLookup("PosID", "tblMetalShopLevel", "Position = ""Operator 4""")

  ElseIf DCount("*", "qryMetalShopEmployeeFunctions", strCriteria) = 5 Then
       lngPosID = 0

  ElseIf DCount("*", "qryMetalShopEmployeeFunctions", strCriteria) = 4 Then
      lngPosID = DLookup("PosID", "tblMetalShopLevel", "Position = ""Operator 3""")

  ElseIf DCount("*", "qryMetalShopEmployeeFunctions", strCriteria) = 3 Then
       lngPosID = 0

  ElseIf DCount("*", "qryMetalShopEmployeeFunctions", _
       strCriteria & " And (FuncID = 1 Or FuncID = 2)") = 2 Then
       lngPosID = DLookup("PosID", "tblMetalShopLevel", "Position = ""Operator 2""")

  ElseIf lngFuncID = 1 Or lngFuncID = 2 Then
      lngPosID = DLookup("PosID", "tblMetalShopLevel", "Position = ""Operator 1""")
  End If

  If lngPosID > 0 Then

     lngEmpPosID = Nz(DMax("EmpPosID", "tblMetalShopEmployeeLevel"), 0) + 1

     strSQL = "INSERT INTO tblMetalShopEmployeeLevel(EmpPosID, EmpID, PosID, DateAchieved) " & _
            "VALUES(" & lngEmpPosID & "," & lngEmpID & "," & lngPosID & "," & _
              IIf(IsNull(varDateCompleted), "NULL", "#" & Format(varDateCompleted, "yyyy-mm-dd hh:nn:ss") & "#") & ")"

        CurrentDb.Execute strSQL, dbFailOnError
  End If

结束功能