如何通过递归CTE实现基于前置值求和的AdjustedAllocation列计算
问题说明
- 需创建名为
AdjustedAllocation的新列,计算方式为:IncrementedSourceRatio乘以(原始AllocationAmount减去该参与者所有前置AdjustedAllocation的总和) - 核心难点:计算时需引用同一列中已生成的前置计算值,且必须依赖所有前置结果才能得到正确值,示例表格最后一列是预期结果
- 已尝试方案:使用过
LAG()、SUM()、COALESCE()函数,添加ROW_NUMBER()及各类临时表,均未解决问题 - 当前思路:已确认需要使用递归查询/CTE,但找到的示例过于简单,无法匹配需求,希望通过该问题的解决方案加深对CTE的理解
测试代码
IF OBJECT_ID('tempdb..#TEMP', 'u') IS NOT NULL DROP TABLE #TEMP IF OBJECT_ID('tempdb..#TEMP2', 'u') IS NOT NULL DROP TABLE #TEMP2 GO CREATE TABLE #TEMP ( PlanID NVARCHAR(10) ,EEID NVARCHAR(15) ,Ticker NVARCHAR(10) ,MarketValue MONEY ,TotalBalance MONEY ,CurrentDenominator MONEY ,AllocationAmount DECIMAL(18,6) ) INSERT INTO #TEMP VALUES ('10241299', '70973', 'VEMAX', 5654.12, 241781.86, 241781.86, 1), ('10241299', '70973', 'VMGMX', 5972.14, 241781.86, 236127.74, 1), ('10241299', '70973', 'VTMGX', 35099.02, 241781.86, 230155.6, 1), ('10241299', '70973', 'VTSAX', 45529.07, 241781.86, 195056.58, 1), ('10241299', '70973', 'VFIAX', 149527.51, 241781.86, 149527.51, 1) SELECT PlanID ,EEID ,TotalBalance ,Ticker ,MarketValue ,CurrentDenominator ,AllocationAmount ,IncrementedSourceRatio = (MarketValue/CurrentDenominator) INTO #TEMP2 FROM #TEMP SELECT PlanID ,EEID ,TotalBalance ,Ticker ,MarketValue ,CurrentDenominator ,AllocationAmount ,IncrementedSourceRatio FROM #TEMP2
示例计算表格
| (A) PlanID | (B) EEID | (C) TotalBalance | (D) Ticker | (E) MarketValue | (F) CurrentDenominator | (G) AllocationAmount | (H) IncrementedSourceRatio | (I) Adjusted Allocation Formula | (J) Adjusted Allocation |
|---|---|---|---|---|---|---|---|---|---|
| 10241299 | 11973 | 241781.86 | VEMAX | 5654.12 | 241781.86 | 1 | 0.0233 | =H2*G2 | 0.0233 |
| 10241299 | 11973 | 241781.86 | VMGMX | 5972.14 | 236127.74 | 1 | 0.0252 | =H3*(G3-J2) | 0.02461284 |
| 10241299 | 11973 | 241781.86 | VTMGX | 35099.02 | 230155.6 | 1 | 0.1525 | =H4*(G4-(J2+J3)) | 0.1451932919 |
| 10241299 | 11973 | 241781.86 | VTSAX | 45529.07 | 195056.58 | 1 | 0.2334 | =H5*(G5-(J2+J3+J4)) | 0.18832902881454 |
| 10241299 | 11973 | 241781.86 | VFIAX | 149527.51 | 149527.51 | 1 | 1 | =H6*(G6-(J2+J3+J4+J5)) | 0.61856483928546 |
内容的提问来源于stack exchange,提问作者JMGJ
相关产品推荐
相关产品推荐

