2015-02-10 75 views
1

我有一個臨時表@table在我的存儲過程是這樣的:SQL - 將數據添加到現有的數據從另一個表

AgtID | Bonus 
------------- 
5063 | 0 
1104 | 0 

和一張桌子bonus,看起來像這樣:

AgtID | Contest | Points | Event 
-------------------------------- 
5063 | 21  | 1000 | 1 
5063 | 21  | 3000 | 3 
1104 | 21  | 1000 | 1 
1104 | 21  | 500 | 2 

並且更新查詢(當前)如下:

UPDATE tt 
SET Bonus = b.Points 
FROM @table tt 
INNER JOIN tblContestData_Bonus b 
ON tt.AgtID = b.AgtID 
where ContestID = 21; 

當前,當我r在這個查詢中,它會用bonus.Points中的數據覆蓋@table.Bonus中的任何數據。這對單個記錄來說很好,但是當我們開始獲得更多獎勵積分時,我需要讓它增加我的價值。

我知道一些語言有i += value ... SQL有類似的東西嗎?

+0

對於單個'AgtID',你有多個'event',所以哪個事件'points'你必須更新到'@ table' – 2015-02-10 17:46:35

+0

我需要所有這些事件。唯一相關的信息是AgtID,Points,然後是ContestID。 – PhoenixUNI 2015-02-12 18:32:20

回答

1

我發佈之後想通了。有趣的是如何工作。我做了什麼:

UPDATE tt 
SET Bonus = coalesce(
     (select SUM(Points) as Points 
     from bonus b 
     where b.AgtID = tt.AgtID 
     and ContestID = 21 
     group by AgtID),0) 
FROM @table tt; 

使用coalesce()在下面的步驟來考慮空值的數學即使沒有記錄工作正常。

0

我可能會丟失你在這裏後在做什麼,但你可以在UPDATE現有值添加到新的價值:

UPDATE tt 
SET Bonus = b.Points + Bonus 
FROM @table tt 
INNER JOIN tblContestData_Bonus b 
ON tt.AgtID = b.AgtID 
where ContestID = 21; 
0

在SQL正確做到這一點,你需要預先彙總b。您無法多次更新單個記錄,因此當有多個匹配項時,update不會累積。它只更新(任意)記錄。

像這樣的事情將採取所有的獎勵積分,並在添加它們:

UPDATE tt 
    SET Bonus = coalesce(tt.Bonus, 0) + b.Points 
FROM @table tt INNER JOIN 
    (select agtId, sum(points) as points 
     from tblContestData_Bonus b 
     group by abtId 
    ) b 
    ON tt.AgtID = b.AgtID 
where ContestID = 21; 
相關問題