SQL新手需要协助w / Query

时间:2013-07-25 17:31:38

标签: sql-server sql-server-2012

以下是我在SQL Server 2012中要做的事情。我想更新表2,其中每个AMT值的总百分比是表1中的总数。但得到%的分母应该只是具有相同MasterDept的行的总数。当我只使用一个MasterDept加载表但在有多个MasterDept时不知道如何操作时,我可以使用此SELECT查询来获取正确的百分比。每个表中的前两列在结构和列中的数据方面都是相同的。

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匹配的值相加。

这有意义吗?

1 个答案:

答案 0 :(得分: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

正如您在子查询中看到的那样,可以将总百分比添加到Table1中,因此您可能甚至不需要Table2,因为它有点多余。

更新:您可以使用CASE语句来处理SUM() 0。