2012-04-23 15 views
6

To są moje tabel:Oblicz sumę kolumny dla wybranych identyfikatorów w SQL

  • użytkownika: Id, Points
  • CartRegister: Id, Member_Id, CartId, RegisterDate, Point
  • SelectetMembers: Id, Member_Id

Członkowie można zarejestrować Koszyk w CartRegister, aw Member.Points Wszystkie punkty, które uzyskał członek, muszą zostać obliczone i wstawione. Potrzebuję więc obliczyć wszystkie punkty każdego z nich i zaktualizować tabelę , ale nie wiem, jak ją zaimplementować.

Poniższy skrypt jest w mojej głowie:

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 ) 

więc jestem mylić co jest gdzie klauzula Select Sum(Point) jeśli używam

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

Następnie suma wszystkich członków być sama z suma wszystkich punktów członkowskich, może potrzebuję czegoś takiego jak foreach Jaka jest Twoja sugestia?

+2

Wierzę, że powinno to być "WHERE [CR]. [Member_Id] = [Member] .Id'. –

+0

@ NikolaMarkovinović Dzięki, że twoja odpowiedź jest poprawna, możesz napisać ją jako odpowiedź i mogę ją zaakceptować. – Saeid

Odpowiedz

0

Zaznacz to:

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

Można użyć CTE (Common Expression tabeli) do pierwszego obliczenia punktów dla każdego członka, a następnie użyć tego inforation zaktualizować Members tabeli:

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

Odmianą @marc_s's solution, który jest w zasadzie same, tylko używa nieco innej składni:

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