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