0

我遇到的情况,我有两个表:SQL Server 2008中:基于优先级UPDATE柱

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是平率或百分比。

现在我想通过为此收款人启动优先级1来填充NetAmount和专用金额。

其优先级1的他的NetAmount将总数为net amount from tableA。如果formattagFlat 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 

感谢

+1

你应该标记与正在使用的数据库这个问题。我相信这是一个难题,因为您必须使用递归CTE在SQL中解决它。 – 2015-01-26 19:45:37

+0

我已经更新了标签。谢谢 – user3294322 2015-01-26 19:55:13

回答

0

你可以使用递归CTE做到这一点我在生成SEED(冷杉t行),而在另一部分,我正在生成逻辑来递归地生成表的其余部分。另外,我假定优先级是渐进式的,您可以根据实际数据集调整逻辑。

事情是这样的:

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 
+0

这工作就像一个魅力。非常感谢! – user3294322 2015-01-27 19:05:56