Вычислить сумму столбцов для выбранных идентификаторов в 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 )