【发布时间】:2020-07-13 19:59:20
【问题描述】:
我目前有以下 Access VBA 函数,其操作方式如 previous question 中所述(对于理解这个问题非常有用):
Private Function MapFields(tableNameTemp As String, tableName As String, commonField As String, newTableName)
Dim tableNameFieldCount As Integer
tableNameFieldCount = GetFieldCount(tableName)
Dim tableNameFieldsArray() As String
ReDim tableNameFieldsArray(0 To tableNameFieldCount) As String ' since you cannot Dim against a variable size
Call GetFields(tableName, tableNameFieldsArray)
sqlJoinQuery = "SELECT tbl_grp_by.*, [" + tableName + "].* " & _
"INTO " + newTableName & _
" FROM (SELECT Max([" + tableNameTemp + "].[Field1]) as [Field1], " & _
"Max([" + tableNameTemp + "].[Field2]) as [Field2], " & _
"Max([" + tableNameTemp + "].[Field3]) as [Field3], " & _
"[" + tableNameTemp + "].[Field4] as [Field4] " & _
"FROM [" + tableNameTemp & _
"] INNER JOIN [" + tableName & _
"] ON [" + tableNameTemp + "].[" + commonField + "] = [" + tableName + "].[" + commonField + "] " & _
"GROUP BY [" + tableNameTemp + "].[" + commonField + "]) as tbl_grp_by " & _
"INNER JOIN [" + tableName & _
"] ON [" + tableName + "].[" + commonField + "] = tbl_grp_by.[" + commonField + "]"
Debug.Print sqlJoinQuery
CurrentDb.Execute sqlJoinQuery
End Function
但是,在我的数据中,Field3 不包含是或否,它可以包含多个值之一。为简单起见,假设这些值可以是以下字符串集中的任何一项:
(0, >1 million, 0001-0010)
在这种情况下,Max() Access SQL 函数将不适用于Field3,因为它们是具有用户定义层次结构的字符串。然而,我需要仍然选择最大值。我将定义从最低 (1) 到最高 (3) 的值:
0>1 million0001-0010
以下是 tableNameTemp 可能出现的示例:
╔════════════════════════╦════════╦════════╦══════════════════════╗
║ Field4 AKA commonField ║ Field1 ║ Field2 ║ Field3 ║
╠════════════════════════╬════════╬════════╬══════════════════════╣
║ SA12 ║ No ║ No ║ 0 ║
╠════════════════════════╬════════╬════════╬══════════════════════╣
║ CY84 ║ No ║ No ║ 0 ║
╠════════════════════════╬════════╬════════╬══════════════════════╣
║ CY84 ║ Yes ║ No ║ 0001-0010 ║
╠════════════════════════╬════════╬════════╬══════════════════════╣
║ CY84 ║ No ║ No ║ >1 million ║
╠════════════════════════╬════════╬════════╬══════════════════════╣
║ CY84 ║ No ║ Yes ║ 0 ║
╠════════════════════════╬════════╬════════╬══════════════════════╣
║ EH09 ║ Yes ║ No ║ >1 million ║
╠════════════════════════╬════════╬════════╬══════════════════════╣
║ EH09 ║ No ║ No ║ >1 million ║
╚════════════════════════╩════════╩════════╩══════════════════════╝
鉴于上面的示例 tableNameTemp 值,下表显示了这些值将如何映射到 tableName 表。请注意它如何选择要映射的最大值。
╔════════════════════════╦════════╦════════╦══════════════════════╗
║ Field4 AKA commonField ║ Field1 ║ Field2 ║ Field3 ║
╠════════════════════════╬════════╬════════╬══════════════════════╣
║ SA12 ║ No ║ No ║ 0 ║
╠════════════════════════╬════════╬════════╬══════════════════════╣
║ CY84 ║ Yes ║ Yes ║ 0001-0010 ║
╠════════════════════════╬════════╬════════╬══════════════════════╣
║ EH09 ║ Yes ║ No ║ >1 million ║
╚════════════════════════╩════════╩════════╩══════════════════════╝
由于我对 Access SQL 和 VBA 的经验都不是很丰富,所以我不知道如何才能做到这一点。我猜它可能涉及硬编码Field3 的可能值列表,然后根据它们在列表中的位置对它们进行排名(即位置 3 将包含值0)。然后,以某种方式使用它作为选择哪个值的键。如果这有任何用处,我在下面提供了它的代码:
Dim hierarchy(0 to 2) As String
hierarchy(0) = "0001-0010" ' highest value '
hierarchy(1) = ">1 million"
hierarchy(2) = "0" ' lowest value '
编辑
根据 Serg 的帮助更新了代码:
sqlJoinQuery = "SELECT tbl_grp_by.[Field1],tbl_grp_by.[Field2], " & _
"Switch( " & _
"tbl_grp_by.[maxfield3] = 0, '0', " & _
"tbl_grp_by.[maxfield3] = 1, '>1 million', " & _
"tbl_grp_by.[maxfield3] = 2 '0001-0010' " & _
") as [Field3], " & _
"tbl_grp_by.[Field4], " & _
"[" + tableName + "].* " & _
"INTO [" + newTableName + "] FROM (" & _
"SELECT Max([" + tableNameTemp + "].[Field1]) as [Field1], " & _
"Max([" + tableNameTemp + "].[Field2]) as [Field2], " & _
"Max(Switch( " * _
"[" + tableNameTemp + "].[Field3] = '0' , 0, " & _
"[" + tableNameTemp + "].[Field3] = '>1 million' , 1, " & _
"[" + tableNameTemp + "].[Field3] = '0001-0010', 2 " & _
"))as [maxField3], " * _
"[" + tableNameTemp + "].[Field4] as [Field4] " * _
"FROM [" + tableNameTemp + "] " & _
"INNER JOIN [" + tableName + "] " & _
"ON [" + tableNameTemp + "].[" + commonField + "] = [" + tableName + "].[" + commonField + "] " & _
"GROUP BY [" + tableNameTemp + "].[" + commonField + "] " & _
") as tbl_grp_by " & _
"INNER JOIN [" + tableName + "] " & _
"ON [" + tableName + "].[" + commonField + "] = tbl_grp_by.[" + commonField + "]"
【问题讨论】:
-
case ... when在 Access SQL 中不受支持。
标签: sql ms-access encoding vba