SQL Server 2008:根据优先级更新列

SQL Server 2008: UPDATE COLUMNS based on priorities

我有一个场景,我有两个表:

CREATE TABLE #TableA (payee_ID int, NetAmount decimal(9,2))
INSERT INTO #tableA (Payee_ID,NetAmount)
VALUES (2408332,1539.18)


CREATE TABLE #TableB (Payee_ID int,Priority int,formatTag char(1), Rate decimal(5,2), Netamount decimal(9,2), dedicatedAmt decimal(9,2))

INSERT INTO #TableB (Payee_ID, Priority, FormatTag, Rate)

VALUES
(2408332,   1,  ‘F’,    500.00),
(2408332,   2,  ‘P’,    0.25),
(2408332,   3,  ‘P’,    0.25),
(2408332,   4,  ‘F’,    100.00),
(2408332,   5,  ‘P’,    1.00)

其中 FormatTag 是统一费率或百分比。

现在我想通过为该收款人启动 priority1 来填充 NetAmount 和专用金额。

他的 priority1 的 NetAmount 将是表 A 中的总 net amount。如果 formattagFlat ratededicated amount 将是 rate

而且,如果formattag是百分比,那么它将是总netAmount的百分比。

我想降低优先级,根据之前优先级使用的dedicatedAmmt,继续减去tableB中的netAmount:

Expected result:
Payee_ID  Priority  formatTag   Rate        Netamount   dedicatedAmt
2408332   1         F           500.00      1539.18     500.00
2408332   2         P           0.25        1039.18     259.80
2408332   3         P           0.25        779.38      194.85
2408332   4         F           100.00      584.53      100.00
2408332   5         P           1.00        484.53      484.53

谢谢

您可以使用 递归 CTE

UNION 的第一部分中,我生成了 SEED(第一行),在另一部分中,我生成了递归生成 table 的其余部分的逻辑。另外,我假设优先级是递增的,您可以根据您的实际数据集调整此处的逻辑。

像这样:

WITH CTE
AS (
    SELECT A.payee_id
        ,[priority]
        ,formattag
        ,rate
        ,cast(A.netamount AS DECIMAL(10, 2)) netamount
        ,cast(CASE 
                WHEN formattag = 'F'
                    THEN rate
                WHEN formattag = 'p'
                    THEN rate * a.netamount
                END AS DECIMAL(10, 2)) dedicatedAmount
        ,cast(A.netamount - (
                CASE 
                    WHEN formattag = 'F'
                        THEN rate
                    WHEN formattag = 'p'
                        THEN rate * a.netamount
                    END
                ) AS DECIMAL(10, 2)) ActualAmount
    FROM #Tableb B
    INNER JOIN #TableA A ON A.Payee_ID = b.Payee_ID
    WHERE priority = 1

    UNION ALL

    SELECT cte.payee_id
        ,B.priority
        ,B.formattag
        ,B.rate
        ,CTE.ActualAmount
        ,cast(CASE 
                WHEN b.formattag = 'F'
                    THEN b.rate
                WHEN b.formattag = 'p'
                    THEN b.rate * CTE.ActualAmount
                END AS DECIMAL(10, 2)) dedicatedamount
        ,cast((
                CTE.ActualAmount - (
                    CASE 
                        WHEN b.formattag = 'F'
                            THEN b.rate
                        WHEN b.formattag = 'p'
                            THEN b.rate * CTE.ActualAmount
                        END
                    )
                ) AS DECIMAL(10, 2)) ActualAmount
    FROM CTE
    INNER JOIN #TableB B ON cte.payee_id = B.payee_id
    WHERE B.priority = cte.priority + 1
    )
SELECT *
FROM CTE
OPTION (MAXRECURSION 0)

结果:

payeeid priority    formattag   rate netamount  dedicatedAmount ActuatAmt
2408332 1   F   500.00  1539.18 500.00  1039.18
2408332 2   P   0.25    1039.18 259.80  779.39
2408332 3   P   0.25    779.39  194.85  584.54
2408332 4   F   100.00  584.54  100.00  484.54
2408332 5   P   1.00    484.54  484.54  0.00