2014-02-20 48 views
3

我試圖使用我們的SELECT語句中得到的結果更新我們的Results表中名爲Number_Of_Marks的列。我們的select語句用於計算結果表中每個模塊的標記數量。該SELECT聲明工程和輸出是正確的,這是使用sql更新現有列與選擇查詢的結果

ResultID ModuleID cnt 
------------------------- 
    111  ART3452 2               
    114  ART3452 2               
    115  CSC3039 3               
    112  CSC3039 3               
    113  CSC3039 3 

在使用該表是:

結果:ResultID, ModuleID, Number_Of_Marks

我們需要CNT的結果被更新到我們Number_Of_Marks列。這是我們的代碼如下...

DECLARE @cnt INT 

SELECT @cnt 

SELECT C.cnt 
    FROM Results S 
     INNER JOIN (SELECT ModuleID, count(ModuleID) as cnt 
        FROM Results 
        GROUP BY ModuleID) C ON S.ModuleID = C.ModuleID 

    UPDATE Results 
    SET [Number_Of_Marks] = (@cnt) 

回答

4

可以使用update/join語法在SQL Server中做到這一點:你從要從子查詢的次數,不

UPDATE s 
    SET [Number_Of_Marks] = c.cnt 
    FROM Results S INNER JOIN 
     (SELECT ModuleID, count(ModuleID) as cnt 
     FROM Results 
     GROUP BY ModuleID 
     ) C 
     ON S.ModuleID = C.ModuleID; 

我承擔未初始化的變量。

編輯:

一般情況下,當你改變的問題,最好是問另一個問題。但有時候,這些變化真的很小。修訂後的查詢看起來是這樣的:

UPDATE s 
    SET [Number_Of_Marks] = c.cnt, 
     Marks = avgmarks 
    FROM Results S INNER JOIN 
     (SELECT ModuleID, count(ModuleID) as cnt, avg(marks * 1.0) as avgmarks 
     FROM Results 
     GROUP BY ModuleID 
     ) C 
     ON S.ModuleID = C.ModuleID; 

請注意,我用1.0乘以marks。這是一種將整數轉換爲數值的快捷方式。 SQL Server對整數求平均值併產生一個整數。通常你想要某種十進制或浮點值。

+0

工作完美,非常感謝:) – user3332742