2010-03-23 8 views
34

Estoy intentando actualizar un campo en la base de datos a la suma de sus valores unidas:SQL de actualización a la suma de sus valores unidas

UPDATE P 
SET extrasPrice = SUM(E.price) 
FROM dbo.BookingPitchExtras AS E 
INNER JOIN dbo.BookingPitches AS P ON E.pitchID = P.ID 
    AND P.bookingID = 1 
WHERE E.[required] = 1 

Cuando ejecuto esto me sale el siguiente error:

"An aggregate may not appear in the set list of an UPDATE statement." 

¿Alguna idea?

+0

¿Qué estás tratando de hacer? ¿Está tratando de actualizar * algunos * registros dbo.BookingPitches con una suma de todos los dbo.BookingPitcheExtras registros 'precio' columna? –

+0

Debe especificar en qué campo desea agrupar si va a usar 'SUM'. – FrustratedWithFormsDesigner

+0

Esta declaración no tiene ningún sentido. ¿Qué es exactamente lo que estás tratando de hacer? –

Respuesta

47

¿Qué tal esto:

UPDATE p 
SET extrasPrice = t.sumPrice 
FROM BookingPitches AS p 
INNER JOIN 
    (
     SELECT PitchID, SUM(Price) sumPrice 
     FROM BookingPitchExtras 
     WHERE [required] = 1 
     GROUP BY PitchID 
    ) t 
    ON t.PitchID = p.ID 
WHERE p.bookingID = 1 
+1

Utilicé esta sintaxis hoy como una guía para dar forma a mi declaración de actualización, funcionó como un amuleto. Como nota al margen, asegúrese de usar los valores de alias exactamente como los ve aquí. No lo hice al principio y pasé un rato tratando de resolver mi problema. –

0

utilizar una consulta sub similar a la de abajo.

UPDATE P 
SET extrasPrice = sub.TotalPrice from 
BookingPitches p 
inner join 
(Select PitchID, Sum(Price) TotalPrice 
    from dbo.BookingPitchExtras 
    Where [Required] = 1 
    Group by Pitchid 
) as Sub 
on p.Id = e.PitchId 
where p.BookingId = 1 
0

se necesita algo como esto:

UPDATE P 
SET ExtrasPrice = E.TotalPrice 
FROM dbo.BookingPitches AS P 
INNER JOIN (SELECT BPE.PitchID, Sum(BPE.Price) AS TotalPrice 
    FROM BookingPitchExtras AS BPE 
    WHERE BPE.[Required] = 1 
    GROUP BY BPE.PitchID) AS E ON P.ID = E.PitchID 
WHERE P.BookingID = 1 
2

Se trata de un error válido. Ver this. Siguiendo (y otros se sugiere a continuación) son las maneras de lograr esto: -

UPDATE P 
SET extrasPrice = t.TotalPrice 
FROM BookingPitches AS P INNER JOIN 
(
    SELECT 
    PitchID, 
    SUM(Price) TotalPrice 
    FROM 
    BookingPitchExtras 
    GROUP BY PitchID 
) t 
ON t.PitchID = p.ID 
+0

@Ashish Gupta - Se parece mucho a mi consulta ... hmm – JonH

+0

ooops ... lo siento..¿Quiere que borre la respuesta? No cargué la respuesta cuando estaba escribiendo la consulta y estaba leyendo ese artículo. –

+0

No, está bien, pensé que era extraño que incluso usáramos el mismo almacenamiento temporal t, y la consulta fue casi exactamente la misma. 2 respuestas son mejores que 1. – JonH

5

Una alternativa a las soluciones anteriores es el uso de alias para las tablas:

UPDATE T1 SET T1.extrasPrice = (SELECT SUM(T2.Price) FROM BookingPitchExtras T2 WHERE T2.pitchID = T1.ID) 
FROM BookingPitches T1; 
0

me encontré con el mismo problema y encontró que podría solucionarlo con un Common Table Expression (disponible en SQL 2005 o posterior):

;with cte as (
    SELECT PitchID, SUM(Price) somePrice 
    FROM BookingPitchExtras 
    WHERE [required] = 1 
    GROUP BY PitchID) 
UPDATE p SET p.extrasPrice=cte.SomePrice 
FROM BookingPitches p INNER JOIN cte ON p.ID=cte.PitchID 
WHERE p.BookingID=1 
0

con postgres, tenía que ajustar la solución a esto funcione para mí:

UPDATE BookingPitches AS p 
SET extrasPrice = t.sumPrice 
FROM 
    (
     SELECT PitchID, SUM(Price) sumPrice 
     FROM BookingPitchExtras 
     WHERE [required] = 1 
     GROUP BY PitchID 
    ) t 
WHERE t.PitchID = p.ID AND p.bookingID = 1 
Cuestiones relacionadas