sql - वीबीए एसक्यूएल एक्सेस करें जो केवल एक से मेल खाता है




vba access-vba ms-access-2010 (2)

मेरे पास एक मेज है जिसमें कई दोहराए गए रिकॉर्ड हैं। इसलिए मैं उन दो बार दोहराए जाने वाले लोगों को लेना चाहता हूं और फिर जांच करूँ कि उनमें से एक को कुल कॉलम में -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              |
----------------------------------------------

उदाहरण के लिए, यह बी की अनदेखी कर देगा क्योंकि दोनों -99 और सी हैं क्योंकि गिनती = 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

नोट: कोड अपडेट किया गया

दूसरी बात यह है कि यह सभी मिलान वाली पंक्तियों के समान मूल्य जोड़ देगा! ऐसा क्यों हो रहा है? क्या मैं अपनी लूप में कुछ गलत कर रहा हूं?


Answers

एक शुद्ध एसक्यूएल समाधान पर विचार करें जिसमें सूक्ष्म UPDATE क्वेरी शामिल होती है जिसमें एक WHERE खंड, एक सशर्त IIF() , और डोमेन समेकित, DLookUp में एक subquery शामिल है।

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

  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product




sql vba access-vba ms-access-2010