Вычислить сумму столбцов для выбранных идентификаторов в SQL

вот мои таблицы:

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

участники могут зарегистрировать корзину в CartRegister и Member.Points все баллы, заработанные членом должны быть рассчитаны и вставлены. Поэтому мне нужно рассчитать все точки каждого SelectedMembers обновить Member таблица, но я не знаю как это реализовать.

следующий сценарий в моей голове:

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  )

поэтому я смущен тем, что такое предложение where в Select Sum(Point) если я использую

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

тогда сумма всех членов будет одинаковой суммы всех членов точки, может быть, мне нужно что-то вроде foreach каково ваше предложение?

3 ответов


вы можете использовать CTE (общее табличное выражение) для первого вычисления точек для каждого члена, а затем использовать эту инфорацию для обновления Members стол:

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

вариант решение@marc_s, который в основном тот же, только использует немного другой синтаксис:

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

проверить это:

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  )