计算SQL中所选Ids的列总和

时间:2012-04-23 10:35:55

标签: sql sql-server sql-server-2008 tsql sql-scripts

这些是我的表格:

  • 会员Id, Points
  • 购物车注册Id, Member_Id, CartId, RegisterDate, Point
  • SelectetMembers Id, Member_Id

会员可以在CartRegisterMember.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  )

所以如果我使用

,我对Select Sum(Point)中的where子句感到困惑
        WHERE [CR].[Member_Id] IN ( Select Member_Id From SelectedMembers  )

然后所有成员的总和与所有成员点数的总和相同,也许我需要foreach你的建议是什么?

3 个答案:

答案 0 :(得分:7)

您可以使用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

答案 1 :(得分:0)

@marc_s's solution的变体基本相同,只使用略有不同的语法:

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

答案 2 :(得分:0)

检查一下:

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  )