这些是我的表格:
Id, Points
Id, Member_Id, CartId, RegisterDate, Point
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 )
所以如果我使用
,我对Select Sum(Point)
中的where子句感到困惑
WHERE [CR].[Member_Id] IN ( Select Member_Id From SelectedMembers )
然后所有成员的总和与所有成员点数的总和相同,也许我需要foreach
你的建议是什么?
答案 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 )