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
。如果 formattag
是 Flat rate
,dedicated 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
我有一个场景,我有两个表:
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
。如果 formattag
是 Flat rate
,dedicated 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