2010-03-23 17 views
34

Próbuję zaktualizować pola w bazie danych do sumy jego przystąpiły wartości:SQL Aktualizacja do sumy jego przystąpiły wartości

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 

Gdy uruchomię to pojawia się następujący błąd:

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

Wszelkie pomysły?

+0

co próbujesz zrobić? Czy próbujesz zaktualizować * niektóre rekordy * dbo.BookingPitches z sumą wszystkich odpowiadających im kolumn dbo.BookingPitcheExtras? Cena? –

+0

Musisz określić, które pole chcesz zgrupować, jeśli zamierzasz używać 'SUMA'. – FrustratedWithFormsDesigner

+0

To stwierdzenie nie ma żadnego sensu. Co dokładnie próbujesz zrobić? –

Odpowiedz

47

Jak o tym:

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

Użyłem tej składni dziś jako przewodnika w kształtowaniu mojej aktualizacji oświadczenie, pracował jak urok. Na marginesie, upewnij się, że używasz wartości alias dokładnie tak, jak je tutaj widzisz. Z początku nie spieszyłem się i przez chwilę zastanawiałem się nad moim problemem. –

0

użyć kwerendy sub podobny do poniżej.

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

Trzeba coś takiego:

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

Jest to ważny błąd. Zobacz this. Następujące (i inni sugerują, poniżej) są sposoby, aby to osiągnąć: -

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 - Wygląda jak moje zapytanie ... hmm – JonH

+0

ooops ... przepraszam .. Czy mogę usunąć odpowiedź? Nie wpisałem odpowiedzi podczas pisania zapytania i czytałem ten artykuł. –

+0

Nie, to jest w porządku Po prostu pomyślałem, że to dziwne, że użyliśmy nawet tego samego magazynu temp, a zapytanie było prawie dokładnie takie samo. 2 odpowiedzi są lepsze niż 1. – JonH

5

Alternatywną do powyższych rozwiązań jest użycie aliasów dla tabel:

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

wpadłem na ten sam problem i okazało się, że mógłbym go rozwiązać z Common Table Expression (dostępne w SQL 2005 lub później):

;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

z PostgreSQL, musiałem dostosować rozwiązanie do pracy z tym do mnie:

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