0

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

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 匹配的值求和。

那有意义吗?

4

1 回答 1

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。

于 2013-07-25T17:49:59.070 回答