2016-10-05 65 views
0

我有一个测试表:自动SQL计算

PiggyBank_Current

- Name (Primary Key) 
-- Jackson 
- Value 
-- 0 

PiggyBank_Default

- Name 
-- Jackson 
- value 
-- 100 

PiggyBank_Earn

- Name 
-- Jackson 
- Value 
-- 20 

难道每次我添加一个新的JA ckson赚取纪录PiggyBank_Earn,它会自动计算所有杰克逊的收入,然后添加它与默认值。那么总数将替换表PiggyBank_Current值上的人名与杰克逊相等的值?因此,对于这个例子,总共是120。

+0

你可以使用触发器。请详细说明您的目标 –

+0

@JoeTaras需求是,对于每个插入'PiggyBank_Earn'的插入,'PiggyBank_Earn'中所有'Value'的总和被添加到'PiggyBank_Default'中保存的'Value'中, ,并且该总数用于覆盖'PiggyBank_Current'中的'Value'以获得相同的'Name'。 – iamdave

+0

请不要使用'nvarchar'字段('name')作为PK。为此目的使用'uniqueidentifier'或'identity'。 – gofr1

回答

1

您可以为此使用触发器。我用id代替[name]联接表:

CREATE TRIGGER PiggyBank_Earn_Trigger 
ON PiggyBank_Earn 
AFTER INSERT, UPDATE 
AS 
;WITH cte AS (
SELECT id, 
     SUM([val]) as [value] 
FROM (
    SELECT d.id, 
      SUM(d.[value]) as [val] 
    FROM inserted i 
    INNER JOIN PiggyBank_Default d 
     ON i.id = d.id 
    GROUP BY d.id 
    UNION ALL 
    SELECT e.id, 
      SUM(i.[value]) as [val] 
    FROM inserted i 
    INNER JOIN PiggyBank_Earn e 
     ON i.id = e.id 
    GROUP BY e.id 
) as t 
) 

MERGE PiggyBank_Current as target 
USING cte as source 
ON target.id = source.id 
WHEN MATCHED THEN 
    UPDATE SET [value] = source.[value] 
WHEN NOT MATCHED THEn 
    INSERT VALUES (source.id, source.[value]); 

它从inserted收集在CTE所有id和2个表中获取资金。然后MERGEPiggyBank_Current表。