2012-04-23 13 views
6

Đây là bảng của tôi:Tính tổng của cột chọn Id trong SQL

  • Member: Id, Points
  • CartRegister: Id, Member_Id, CartId, RegisterDate, Point
  • SelectetMembers: Id, Member_Id

Các thành viên có thể đăng ký Giỏ hàng theo số CartRegister và trong Member.Points Tất cả các điểm mà thành viên kiếm được phải được tính toán và chèn vào. Vì vậy, tôi cần tính toán tất cả các điểm của mỗi SelectedMembers và cập nhật bảng Member, nhưng tôi không biết cách triển khai nó.

Các kịch bản sau đây là trong đầu tôi:

UPDATE [Member] 
    SET [Points]= 
    (
     SELECT SUM([CR].[Point]) AS [AllPoints] 
     FROM [CartRegister] AS [CR] 
     WHERE [CR].[Member_Id] = --??? 

    ) 
    WHERE [Members].[Member].[Id] IN (SELECT Member_Id From SelectedMembers ) 

Vì vậy, tôi đang bối rối tới là những gì các mệnh đề where trong Select Sum(Point) nếu tôi sử dụng

 WHERE [CR].[Member_Id] IN (Select Member_Id From SelectedMembers ) 

Sau đó tổng của tất cả các thành viên có cùng một tổng của tất cả các điểm thành viên, có lẽ tôi cần một cái gì đó như foreach Đề xuất của bạn là gì?

+2

Tôi tin rằng nó nên là 'WHERE [CR]. [Member_Id] = [Member] .Id'. –

+0

@ NikolaMarkovinović Cảm ơn câu trả lời của bạn là chính xác, bạn có thể viết nó như là một câu trả lời, và tôi có thể chấp nhận nó. – Saeid

Trả lời

0

Kiểm tra này:

UPDATE [Member] 
SET [Points]= 
(
    SELECT SUM([CR].[Point]) AS [AllPoints] 
    FROM [CartRegister] AS [CR] 
    WHERE [CR].[Member_Id] = [Member].[Id] 

) 
WHERE [Members].[Member].[Id] IN (SELECT Member_Id From SelectedMembers ) 
7

Bạn có thể sử dụng một CTE (Common Table Expression) để lần đầu tiên tính toán điểm cho mỗi thành viên, và sau đó sử dụng inforation đó để cập nhật các Members bảng:

-- this CTE takes all selected members, and calculates their total of points 
;WITH MemberPoints AS 
(
    SELECT 
     Member_ID, 
     AllPoints = SUM(Point) 
    FROM 
     CartRegister 
    WHERE 
     Member_ID IN (SELECT ID FROM SelectedMembers) 
    GROUP BY 
     Member_ID 
) 
UPDATE dbo.Member 
SET Points = mp.AllPoints 
FROM MemberPoints mp 
WHERE dbo.Member.Member_ID = mp.Member_ID 
0

Một biến thể của @marc_s's solution, mà về cơ bản là cùng, chỉ sử dụng một cú pháp hơi khác nhau:

WITH aggregated AS (
    SELECT 
    *, 
    AllPoints = SUM(Point) OVER (PARTITION BY Member_ID) 
    FROM CartRegister 
    WHERE Member_ID IN (SELECT ID FROM SelectedMembers) 
) 
UPDATE aggregated 
SET Points = AllPoints