2010-03-23 8 views
34

Tôi đang cố gắng để cập nhật một lĩnh vực trong cơ sở dữ liệu để tổng các giá trị tham gia của nó:SQL Update để SUM các giá trị tham gia của nó

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 

Khi tôi chạy này, tôi nhận được lỗi sau:

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

Bất kỳ ý tưởng nào?

+0

bạn đang cố gắng làm gì? Bạn đang cố gắng cập nhật * một số * dbo.BookingPitches hồ sơ với một tổng của tất cả các dbo.BookingPitcheExtras bản ghi tương ứng 'giá' cột? –

+0

Bạn cần xác định trường nào bạn muốn nhóm nếu bạn định sử dụng 'SUM'. – FrustratedWithFormsDesigner

+0

Tuyên bố này không có ý nghĩa gì. Chính xác thì bạn đang cố gắng làm gì? –

Trả lời

47

Làm thế nào về điều này:

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

Tôi đã sử dụng cú pháp này ngày hôm nay làm hướng dẫn trong việc định hình bản sao kê cập nhật của tôi, hoạt động như một sự quyến rũ. Là một lưu ý phụ, hãy đảm bảo sử dụng các giá trị bí danh chính xác như bạn thấy ở đây. Lúc đầu tôi đã không ở đó và đã dành một chút thời gian để tìm ra vấn đề của mình. –

0

Sử dụng một truy vấn phụ tương tự như dưới đây.

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

Bạn cần một cái gì đó như thế này:

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

Đây là một lỗi hợp lệ. Xem this. Sau (và những người khác gợi ý dưới đây) là những cách để đạt được điều này: -

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 - Trông rất giống với truy vấn của tôi ... hmm – JonH

+0

ooops ... xin lỗi..Chúng tôi có muốn xóa câu trả lời không? Tôi không tải câu trả lời khi tôi đang viết truy vấn và đang đọc bài viết đó. –

+0

Không có gì là tốt Tôi chỉ nghĩ rằng đó là lẻ mà chúng tôi thậm chí còn sử dụng cùng một lưu trữ tạm thời t, và các truy vấn khá gần như giống nhau. 2 câu trả lời là tốt hơn sau đó 1. – JonH

5

Một thay thế cho các giải pháp trên được sử dụng biệt hiệu cho Bàn:

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

Tôi chạy vào cùng một vấn đề và thấy rằng tôi có thể giải quyết nó với một Common Table Expression (có sẵn trong SQL 2005 hoặc mới hơn):

;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

với postgres, tôi đã phải điều chỉnh các giải pháp với điều này để làm việc cho tôi:

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