2012-04-23 19 views
6

Estos son mis tablas:Calcular suma de la columna de identificadores seleccionados en SQL

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

Miembros puede registrar Carro en CartRegister, y en Member.Points Todos los puntos que un miembro ganó deben ser calculados e insertados. Así que necesito calcular todos los puntos de cada SelectedMembers y actualizar la tabla Member, pero no sé cómo implementarlo.

La siguiente secuencia de comandos está en mi cabeza:

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 ) 

así que estoy confundido con lo que es la cláusula where de Select Sum(Point) si uso

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

Entonces la suma de todos los miembros sea igual de suma de todos los miembros Punto, tal vez necesito algo como foreach ¿Cuál es su sugerencia?

+2

Creo que debería ser 'WHERE [CR]. [Member_Id] = [Member] .Id'. –

+0

@ NikolaMarkovinović Gracias, tu respuesta es correcta, ¿puedes escribirla como respuesta y puedo aceptarla? – Saeid

Respuesta

0

Comprobar esto:

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

Se puede usar un CTE (expresión de tabla común) para calcular primero los puntos para cada miembro, y luego usar esa inforation para actualizar la tabla 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 
0

Una variante de @marc_s's solution, que es básicamente el mismo, solo que utiliza una sintaxis ligeramente diferente:

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