2016-10-05 119 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表。