SQL累积列

时间:2018-06-19 15:19:05

标签: sql sql-server

我正在尝试编写查询以使保险的已赔损失三角形。我制作了一个表格,其中有一个列为损失日期,然后有多个列为损失日期后x个月内发送的总付款支票。损失三角形的问题是它们需要从左到右累积。有没有更清洁的方法可以做到这一点?谢谢!

select
[Date of loss month],
--The following shows the cumulative paid development of losses by months old
[Payments after 0 months]=[0],
[Payments after 1 months]=[0]+[1],
[payments after 2 months]=[0]+[1]+[2],

[3]=[0]+[1]+[2]+[3],
[4]=[0]+[1]+[2]+[3]+[4],
[5]=[0]+[1]+[2]+[3]+[4]+[5],
[6]=[0]+[1]+[2]+[3]+[4]+[5]+[6],

--...Need it to go out to 120 months. 

1 个答案:

答案 0 :(得分:0)

您可以按照以下示例进行操作。它取消数据透视和数据透视。我只写了0到10列,您可以轻松添加其余的列。

IF OBJECT_ID('tempdb..#PaymentsSummary') IS NOT NULL
    DROP TABLE #PaymentsSummary

CREATE TABLE #PaymentsSummary (
    Date DATE,
    [0] INT,
    [1] INT,
    [2] INT,
    [3] INT,
    [4] INT,
    [5] INT,
    [6] INT,
    [7] INT,
    [8] INT,
    [9] INT,
    [10] INT)

INSERT INTO #PaymentsSummary
VALUES
    ('2018-06-10', 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10),
    ('2018-06-11', 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100)

DECLARE @StartRange INT = 0
DECLARE @EndRange INT = 10

;WITH Ranges AS
(
    SELECT
        StartRange = @StartRange,
        EndRange = @StartRange

    UNION ALL

    SELECT
        StartRange = R.StartRange,
        EndRange = R.EndRange + 1
    FROM
        Ranges AS R
    WHERE
        R.EndRange < @EndRange
),
UnpivotedSummary AS
(
    SELECT
        P.Date,
        P.MonthNumber,
        P.Value
    FROM
        #PaymentsSummary AS S
        UNPIVOT (
            Value FOR MonthNumber IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10])
        ) AS P
),
RangeTotals AS
(
    SELECT
        P.Date,
        C.EndRange,
        TotalValue = SUM(P.Value)
    FROM
        Ranges AS C
        INNER JOIN UnpivotedSummary AS P ON P.MonthNumber BETWEEN C.StartRange AND C.EndRange
    GROUP BY
        P.Date,
        C.EndRange
)
SELECT
    P.*
FROM
    RangeTotals AS R
    PIVOT (
        MAX(R.TotalValue) FOR R.EndRange IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10])
    ) AS P

我强烈建议您更改表的结构,以按付款方式存储数据(只需支付1次!),并且尚未进行数据透视或堆叠在一起。