我有一个表有几个重复的记录。所以我想把那些被重复两次,然后检查其中只有一个在整个列中的值是-99,所以如果他们两个都有-99,它将忽略它们,但是如果其中只有一个具有 - 99将比第二个值计算它们并将结果分配给带-99的结果。访问vba sql只匹配一个
---------------------------------------------
Name | N1 | N2 |
----------------------------------------------
A | 500 | 300 |
----------------------------------------------
A | 0 | **-99** |
----------------------------------------------
B | 60 | -99 |
----------------------------------------------
B | 77 | -99 |
----------------------------------------------
C | 0 | -99 |
----------------------------------------------
C | 15 | 100 |
----------------------------------------------
C | 30 | -9 |
----------------------------------------------
例如这里它将因为二者都具有-99与c忽略B,因为计数= 3,但对于它会更新-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
注:CODE修订
其他问题在于它会为所有匹配的行添加相同的值!为什么会这样?我在循环中做错了什么?
我想这个问题应该被回滚到以前的编辑后提供的答案,所以没有人知道你的原始代码看起来像什么,除非他们通过你的编辑。 (也提供的答案不应该在一个循环中 - 它在一个命中的所有记录上工作)。 –
我做了没有循环,并为所有匹配分配了一个空值! – RAKH
它使用你的文章中的数字为我工作。你不是用VBA吗?只需将SQL作为新查询添加并运行即可。 –