以下是我在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匹配的值相加。
这有意义吗?
答案 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。