2017-07-19 6 views
2

私はいくつかの繰り返しレコードを持つテーブルを持っています。だから私は2回繰り返されたものを取って、それらのうちの1つだけが合計の列に-99の値を持っているかどうかをチェックしたいと思います。もし両方が-99なら無視しますが、 99よりも2番目の値を取って計算し、その結果を-99で代入します。例えば1つだけに一致する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カウント= 3ので、しかしAのためにそれがために-99行が更新されているのでここではBを無視する:= 200 500から300

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

後、私はこの質問は、前の編集にロールバックされなければならないと思っています - あなたは、回答にあなたの質問を更新していますあなたの編集内容を見ない限り、元のコードがどのように見えるかは誰にも分かりません。 (また、提供された回答はループに入るべきではなく、1回のヒットですべてのレコードに適用されます)。 –

+0

私はループなしでそれを行い、それはすべての一致にnull値を割り当てました! – RAKH

+0

あなたの記事の数字を使って私の仕事をしました。あなたはVBAでそれを使用していませんか? SQLを新しいクエリとして追加して実行するだけです。 –

答えて

3

WHERE句、条件付きIIF()、およびドメイン集計、DLookUpのサブクエリが含まれて微妙なUPDATEクエリで純粋な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

関連する問題