我正在尝试编写查询以使保险的已赔损失三角形。我制作了一个表格,其中有一个列为损失日期,然后有多个列为损失日期后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.
答案 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次!),并且尚未进行数据透视或堆叠在一起。