2017-07-19 65 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