2013-07-25 169 views
0

以下是我正在嘗試在SQL Server 2012中執行的操作。我想用表1中每個AMT值佔總數的百分比更新表2。得到%應該只是具有相同MasterDept的行的總數。當我只用一個MasterDept加載表格時,我可以使用這個SELECT查詢來獲取正確的百分比,但當有多個MasterDept時不知道如何去做。每個表中的前兩列在結構和列中的數據上都是相同的。SQL新手需要幫助查詢

SELECT ABCID, 
    [AMT%] = ClientSpreadData.AMT/CONVERT(DECIMAL(16,4),(SELECT SUM(ClientSpreadData.AMT) 
    FROM ClientSpreadData)) 
FROM ClientSpreadData 

表數據

TABLE 1 (MasterDept varchar(4), ABCID varchar(20), AMT INT) 
Sample Data (4700, 1, 25), 
      (4300, 2, 30), 
      (4700, 3, 50), 
      (4300, 4, 15) 

TABLE 2 (MasterDept varchar(4), ABCID varchar(20), [AMT%] INT) 
Sample Data (4700, 1, AMT%) 

AMT%應該等於AMT/SUM(AMT)。 SUM(AMT)應該只是總結表1中的MasterDept與表2中的MasterDept相匹配的值。

這是否有意義?

+0

哪個RDBMS您使用的SUM()? MySQL,SQL Server 2008/20012等? –

+0

對不起!我正在使用SQL Server 2012 –

+0

我正在嘗試更新表2不插入它以及 –

回答

0

你可以使用一個窗口來獲得分區SUM()

SELECT MasterDept, ABCID, AMT, SUM(AMT) OVER(PARTITION BY MasterDept) 
FROM #Table1 

你可以用它來得到的百分比爲每一行來更新你的第二個表(假定每MasterDept/ABCID組合1行):

UPDATE A 
SET A.[AMT%] = B.[AMT%] 
FROM Table2 A 
JOIN (SELECT MasterDept 
      , ABCID 
      , AMT 
      , CASE WHEN SUM(AMT) OVER(PARTITION BY MasterDept) = 0 THEN 0 
        ELSE AMT*1.0/SUM(AMT) OVER(PARTITION BY MasterDept) 
      END 'AMT%' 
     FROM #Table1 
    ) B 
    ON A.MasterDept = B.MasterDept 
    AND A.ABCID = B.ABCID 

正如你可以在子查詢看到,總的百分比可以被添加到您的表1,所以也許你甚至不需要表2,因爲它是有點多餘。

更新:您可以使用CASE語句來處理一個0

+0

當我運行此腳本時,所有內容都剛剛更新爲0.0000 –

+0

您可能在編輯之間發現了它,我更改了* 1.0部分的位置因爲我第一次放入時錯過了()。 –

+0

你完全正確!我只是做了改變,它效果很好!謝謝! –