0

난 두 테이블을 가지고 시나리오를 가지고 : FormatTag는 고정 요금 또는 비율이SQL 서버 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) 

.

이제이 수취인에 대해 우선 순위 1을 시작하여 NetAmount 및 전용 금액을 채 웁니다.

우선 순위 1에 대한 그의 NetAmount은 tableA의 net amount입니다. 이 Flat rate 인 경우 dedicated amountrate이됩니다.

그리고 formattag이 백분율이면 합계 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에서 해결해야한다는 점에서 이것이 어려운 문제라고 생각합니다. –

+0

태그를 업데이트했습니다. 감사합니다 – user3294322

답변

0

당신은 재귀 CTE 사용하여이 작업을 수행 할 수 있습니다 :

나는 우선 순위를 아래로 이동하고 이전 우선 순위에 사용되는 dedicatedAmmt에 따라 TableB의에서 netAmount을 뺀 유지하려면

UNION의 첫 번째 부분에서 나는 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