run - Acceda a vba sql que coincida solo con uno
select sql access vba (1)
Tengo una mesa que tiene varios registros repetidos. Así que quiero tomar los que se repitieron dos veces y luego verificar si solo uno de ellos tiene un valor de -99 en la columna total, entonces si ambos tienen -99 los ignorará, pero si solo uno de ellos tiene, 99 que tomará los valores del segundo para calcularlos y asignar el resultado al que tiene -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 |
----------------------------------------------
Por ejemplo, aquí ignorará B porque ambos tienen -99 AND C porque count = 3, pero para A actualizará la fila -99 a ser: 500-300 = 200
---------------------------------------------
Name | N1 | N2 |
----------------------------------------------
A | 500 | 300 |
----------------------------------------------
A | 0 | **200** |
----------------------------------------------
He hecho algo del código pero no sabía ho para completarlo:
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
NOTA: CÓDIGO ACTUALIZADO
¡El otro problema es que agregará el mismo valor a todas las filas coincidentes! ¿Por qué es ese happing? ¿Estoy haciendo algo mal en mi loop?
Considere una solución SQL pura con una consulta de UPDATE
matizada que incluye una subconsulta en la cláusula WHERE
, un IIF()
condicional y un agregado de dominio, 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))
Antes de la mesa
Name N1 N2
A 500 300
A 0 -99
B 60 -99
B 77 -99
C 0 -99
C 15 100
C 30 -9
Después de la mesa
Name N1 N2
A 500 300
A 0 200
B 60 -99
B 77 -99
C 0 -99
C 15 100
C 30 -9