访问 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