Usuario
Subconsulta con UPDATE

Pregunta
-
Buenas Noches!
Tengo una tabla (Concurso) de ACCESS con los siguientes campos:
Equipo | Total_Puntos | Integrantes | Puntos_Obtenidos
1 María 0
1 Luis 5
1 Juan 2
2 Elsa 10
2 Victor 15
2 Denis 0
...... (hasta un total de 3000 registros)
Los Puntos obtenidos por cada Integrante van aumentando según los que consiguen en cada fase del concurso y necesito que cuando los actualizo se sumen el total de puntos de todos los integrantes del mismo equipo y se registren en el campo Total_Puntos, pero no se como hacerlo, es decir, para el quipo 1 debería reflejarse 7 y para el equipo 2, 25.
He intentado lo siguiente:
Consulta = "UPDATE Concurso As A INNER JOIN (Select SUM(Puntos_Obtenidos) as Puntos, Serie From Concurso Group By Equipo) As B SET A.Premios = B.Puntos On A.Equipo= B.Equipo)"........................Pero me da error de sintaxis.
Gracias.
- Cambiado EricRR lunes, 15 de marzo de 2021 14:21 SQL
Todas las respuestas
-
Te sale error de sintaxis porque en el INNER JOIN te falta la cláusula ON para indicar el criterio de unión, y además porque la sintaxis del UPDATE requiere que el JOIN vaya detrás del FROM (con lo que tienes que repetir la tabla dos veces).
A mí me resulta más claro escribirlo con una subquery en lugar de con un Join. Aunque en teoría el Join se supone que s más eficiente, en la práctica el optimizador de consultas de SQL Server es lo bastante inteligente para convertir internamente la sentencia de forma que le sale el mismo plan de ejecución.
Update Concurso as A set A.Total_Puntos = ( select SUM(Puntos_Obtenidos) From Concurso As B where B.Equipo = A.Equipo )
-
-
Si tomamos como ejemplo a todos los integrantes del equipo 1 y sumamos sus puntos obtenidos, ¿quieres que en el campo TotalPuntos a cada uno se le inserte el valor 7? si es a si, creo que esta consulta podría servirte:
UPDATE dbo.Consurso SET dbo.Consurso.Total_Puntos = (SELECT sum(c.Puntos_Obtenidos) puntosTotales FROM dbo.Consurso c WHERE c.Equipo = dbo.Consurso.Equipo)
Ahí veras que el resultado obtenido es la sumatoria de todos los puntos.
Lo que no veo del todo correcto es que este valor este almacenado en la misma tabla que los puntos que estamos sumando, a si como repetir esa información para cada integrante del equipo, si esto es para un reporte, creo que hacer ese sum en el query de selección posiblemente sea una mejor idea.
Ojala te sea de utilidad
Saludos desde Monterrey, Nuevo León, México!!!
-
Buenos Días!
Me sigue dando el mismo error. Lo tengo solucionado de la forma siguiente (pero creo que si consiguiera hacerlo en una instrucción única sería mucho mejor):
'PRIMERO OBTENGO LA SUMA POR EQUIPOS Y LAS PONGO EN UN ARRAY
Consulta = "Select SUM(Puntos_Obtenidos) As Total, Equipo From Concurso Group By Equipo"
CmdOle = New OleDb.OleDbCommand(Consulta, Conex)
CmdOle.CommandType = CommandType.Text
CmdOle.ExecuteNonQuery()
DaOle = New OleDb.OleDbDataAdapter(CmdOle)
Dt = New DataTable
DaOle.Fill(Dt)
'
If Dt.Rows.Count > 0 Then
For i As Integer = 0 To Dt.Rows.Count - 1
Dim row As DataRow = Dt.Rows.Item(i)
ArrayPuntos(Convert.ToInt32(row("Equipo"))) = Convert.ToString(row("Total"))
Next
End If
'
A CONTINUACIÓN REGISTRO CADA RESULTADO (GUARDADO EN EL ARRAY)For i As Integer = 1 To UBound(ArrayPuntos)
If ArrayPuntos(i) > 0 Then
Consulta = "UPDATE Concurso SET Total_Puntos = " & ArrayPuntos(i) & " Where Equipo = " & i
CmdOle = New OleDb.OleDbCommand(Consulta, Conex)
CmdOle.CommandType = CommandType.Text
CmdOle.ExecuteNonQuery()
End If
Next -