2017-07-19 64 views
2

我有一个表有几个重复的记录。所以我想把那些被重复两次,然后检查其中只有一个在整个列中的值是-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修订

其他问题在于它会为所有匹配的行添加相同的值!为什么会这样?我在循环中做错了什么?

+1

我想这个问题应该被回滚到以前的编辑后提供的答案,所以没有人知道你的原始代码看起来像什么,除非他们通过你的编辑。 (也提供的答案不应该在一个循环中 - 它在一个命中的所有记录上工作)。 –

+0

我做了没有循环,并为所有匹配分配了一个空值! – RAKH

+0

它使用你的文章中的数字为我工作。你不是用VBA吗?只需将SQL作为新查询添加并运行即可。 –

回答

3

考虑一个具有细微差别的UPDATE查询包含在WHERE子句子查询,条件IIF(),和域聚合,DLookUp纯SQL溶液。你与响应更新您的问题 -

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)) 

表之前

Name N1 N2 
A  500 300 
A  0 -99 
B  60 -99 
B  77 -99 
C  0 -99 
C  15 100 
C  30 -9 

Name N1 N2 
A  500 300 
A  0 200 
B  60 -99 
B  77 -99 
C  0 -99 
C  15 100 
C  30 -9 
+0

谢谢你的回复..我更新了你的代码,你可以在我的代码中看到上面的代码,但是我得到一个错误,说更新中的语法错误? – RAKH

+0

我错过了引号!它工作...非常感谢你.. – RAKH

+0

有一个问题,我只是注意到它会将相同的值添加到所有匹配的行!为什么会这样?我在循环中做错了什么? – RAKH