访问 vba sql 只匹配一个
Access vba sql that match only one
我有一个 table 有几个重复的记录。所以我想取那些重复两次的,然后检查是否只有其中一个在总计列中的值为 -99,所以如果它们都有 -99,它将忽略它们,但如果只有一个有 - 99 比它将使用第二个的值来计算它们并将结果分配给带有 -99 的那个。
---------------------------------------------
Name | N1 | N2 |
----------------------------------------------
A | 500 | 300 |
----------------------------------------------
A | 0 | **-99** |
----------------------------------------------
B | 60 | -99 |
----------------------------------------------
B | 77 | -99 |
----------------------------------------------
C | 0 | -99 |
----------------------------------------------
C | 15 | 100 |
----------------------------------------------
C | 30 | -9 |
----------------------------------------------
例如这里它将忽略 B,因为两者都有 -99 和 C,因为计数 = 3,但对于 A,它将更新 -99 行为:500-300 =200
---------------------------------------------
Name | N1 | N2 |
----------------------------------------------
A | 500 | 300 |
----------------------------------------------
A | 0 | **200** |
----------------------------------------------
我已经完成了一些代码,但不知道如何完成它:
Private Sub GET_TWO_COU()
Dim COUs As Variant
Dim p As Variant
Dim sql As String
Dim STR As New ADODB.Recordset
sql = "SELECT DISTINCT NAME FROM STR_TBL"
STR.Open sql, cnn, adOpenStatic
STR.MoveLast
STR.MoveFirst
COUs = STR.GetRows(STR.RecordCount)
STR.Close
For Each p In COUs
Q1 = "SELECT NAME FROM STR_TBL"
STR.Open sql, cnn, adOpenStatic
Do Until STR.EOF
DoEvents
sql = " UPDATE STR_TBL I" _
& "Set I.N2 = IIf(I.N2 = -99, DLookup(""N1 - N2"" ," _
& """STR_TBL"" , '"[NAME] ='" & p & "' AND N2<> -99""), N2)" _
& "WHERE I.[NAME] IN (SELECT I.[NAME] FROM STR_TBL I" _
& " GROUP BY I.[NAME] HAVING (Count(I.[NAME]) = 2)" _
& "AND (Min(I.N2) <> Max(I.N2))AND (Min(I.N2) = -99 OR Max(I.N2) = -99))"
DoCmd.SetWarnings False
DoCmd.RunSQL sql
DoCmd.SetWarnings True
STR.MoveNext
Loop
STR.Close
NEXT
End Sub
注意:代码已更新
另一个问题是它会为所有匹配的行添加相同的值!为什么会这样?我在循环中做错了什么吗?
考虑一个带有细微差别 UPDATE
查询的纯 SQL 解决方案,其中包括 WHERE
子句中的子查询、条件 IIF()
和域聚合 DLookUp
.
UPDATE myTable t
SET t.N2 = IIF(t.N2 = -99, DLookUp("N1-N2", "myTable", "[Name]='" & t.[Name] & "' AND N2 <> -99"), N2)
WHERE t.[Name] IN (SELECT t.[Name]
FROM myTable t
GROUP BY t.[Name]
HAVING (Count(t.[Name]) = 2)
AND (Min(t.N2) <> Max(t.N2))
AND (Min(t.N2) = -99 OR Max(t.N2) = -99))
之前 table
Name N1 N2
A 500 300
A 0 -99
B 60 -99
B 77 -99
C 0 -99
C 15 100
C 30 -9
table
之后
Name N1 N2
A 500 300
A 0 200
B 60 -99
B 77 -99
C 0 -99
C 15 100
C 30 -9
我有一个 table 有几个重复的记录。所以我想取那些重复两次的,然后检查是否只有其中一个在总计列中的值为 -99,所以如果它们都有 -99,它将忽略它们,但如果只有一个有 - 99 比它将使用第二个的值来计算它们并将结果分配给带有 -99 的那个。
---------------------------------------------
Name | N1 | N2 |
----------------------------------------------
A | 500 | 300 |
----------------------------------------------
A | 0 | **-99** |
----------------------------------------------
B | 60 | -99 |
----------------------------------------------
B | 77 | -99 |
----------------------------------------------
C | 0 | -99 |
----------------------------------------------
C | 15 | 100 |
----------------------------------------------
C | 30 | -9 |
----------------------------------------------
例如这里它将忽略 B,因为两者都有 -99 和 C,因为计数 = 3,但对于 A,它将更新 -99 行为:500-300 =200
---------------------------------------------
Name | N1 | N2 |
----------------------------------------------
A | 500 | 300 |
----------------------------------------------
A | 0 | **200** |
----------------------------------------------
我已经完成了一些代码,但不知道如何完成它:
Private Sub GET_TWO_COU()
Dim COUs As Variant
Dim p As Variant
Dim sql As String
Dim STR As New ADODB.Recordset
sql = "SELECT DISTINCT NAME FROM STR_TBL"
STR.Open sql, cnn, adOpenStatic
STR.MoveLast
STR.MoveFirst
COUs = STR.GetRows(STR.RecordCount)
STR.Close
For Each p In COUs
Q1 = "SELECT NAME FROM STR_TBL"
STR.Open sql, cnn, adOpenStatic
Do Until STR.EOF
DoEvents
sql = " UPDATE STR_TBL I" _
& "Set I.N2 = IIf(I.N2 = -99, DLookup(""N1 - N2"" ," _
& """STR_TBL"" , '"[NAME] ='" & p & "' AND N2<> -99""), N2)" _
& "WHERE I.[NAME] IN (SELECT I.[NAME] FROM STR_TBL I" _
& " GROUP BY I.[NAME] HAVING (Count(I.[NAME]) = 2)" _
& "AND (Min(I.N2) <> Max(I.N2))AND (Min(I.N2) = -99 OR Max(I.N2) = -99))"
DoCmd.SetWarnings False
DoCmd.RunSQL sql
DoCmd.SetWarnings True
STR.MoveNext
Loop
STR.Close
NEXT
End Sub
注意:代码已更新
另一个问题是它会为所有匹配的行添加相同的值!为什么会这样?我在循环中做错了什么吗?
考虑一个带有细微差别 UPDATE
查询的纯 SQL 解决方案,其中包括 WHERE
子句中的子查询、条件 IIF()
和域聚合 DLookUp
.
UPDATE myTable t
SET t.N2 = IIF(t.N2 = -99, DLookUp("N1-N2", "myTable", "[Name]='" & t.[Name] & "' AND N2 <> -99"), N2)
WHERE t.[Name] IN (SELECT t.[Name]
FROM myTable t
GROUP BY t.[Name]
HAVING (Count(t.[Name]) = 2)
AND (Min(t.N2) <> Max(t.N2))
AND (Min(t.N2) = -99 OR Max(t.N2) = -99))
之前 table
Name N1 N2
A 500 300
A 0 -99
B 60 -99
B 77 -99
C 0 -99
C 15 100
C 30 -9
table
之后Name N1 N2
A 500 300
A 0 200
B 60 -99
B 77 -99
C 0 -99
C 15 100
C 30 -9