2010-03-23 5 views
34

Je suis en train de mettre à jour un champ dans la base de données à la somme de ses valeurs jointes:Mise à jour de SQL à la somme de ses valeurs jointes

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 

Quand je lance ce que je reçois l'erreur suivante:

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

Des idées?

+0

qu'essayez-vous de faire? Essayez-vous de mettre à jour * certains enregistrements dbo.BookingPitches avec la somme de tous les enregistrements dbo.BookingPitcheExtras correspondants? Price' colonne? –

+0

Vous devez spécifier le champ sur lequel vous voulez vous regrouper si vous voulez utiliser SUM. – FrustratedWithFormsDesigner

+0

Cette affirmation n'a aucun sens. Qu'est-ce que vous essayez de faire exactement? –

Répondre

47

Que diriez-vous ceci:

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

J'ai utilisé cette syntaxe aujourd'hui comme un guide dans la mise en forme de ma déclaration de mise à jour, a travaillé comme un charme. En note, assurez-vous d'utiliser les valeurs d'alias exactement comme vous les voyez ici. Je n'ai pas d'abord et j'ai passé un peu de temps à essayer de comprendre mon problème. –

0

Utilisez une sous requête similaire à celle ci-dessous.

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

Vous avez besoin quelque chose comme ceci:

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

Ceci est une erreur valide. Voir this. À la suite (et d'autres ont suggéré ci-dessous) sont les moyens d'y parvenir: -

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 - ressemble beaucoup à ma requête ... hmm – JonH

+0

ooops ... désolé..voulez-moi supprimer la réponse? Je n'ai pas chargé la réponse quand j'écrivais la requête et lisais cet article. –

+0

Non c'est très bien Je pensais juste que c'était bizarre que nous utilisions même le même stockage temporaire, et la requête était presque exactement la même. 2 réponses sont meilleures que 1. – JonH

5

Un autre des solutions ci-dessus est d'utiliser des alias pour les tableaux:

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

je suis tombé sur la même question et a constaté que Je pourrais le résoudre avec un Common Table Expression (disponible dans SQL 2005 ou plus tard):

;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

postgres, je devais ajuster la solution que cela fonctionne pour moi:

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