【问题标题】:SQL Server 2008: UPDATE COLUMNS based on prioritiesSQL Server 2008:根据优先级更新列
【发布时间】:2015-01-26 19:42:16
【问题描述】:

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

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 和专用 Amount。

他的NetAmount 优先级1 将是表A 中的net amount 总数。如果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

谢谢

【问题讨论】:

  • 你应该用你正在使用的数据库标记这个问题。我相信这是一个难题,因为您必须使用递归 CTE 在 SQL 中解决它。
  • 我已经更新了标签。谢谢

标签: sql-server sql-server-2008 common-table-expression recursive-query


【解决方案1】:

您可以使用递归 CTE

做到这一点

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

类似这样的:

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

【讨论】:

    猜你喜欢
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2015-05-04
    • 1970-01-01
    相关资源
    最近更新 更多