如何查找两个日期之间的总季度并复制数据n-1次?

时间:2018-02-07 03:11:18

标签: sql sql-server

我的表格看起来像下面的图片,但是还有一些字段(额外的字段基本上无关紧要;试图保持这个简单)。

enter image description here

我想计算季度和兴趣*校长,但扭曲是......我需要插入与宿舍相同数量的行,并从上面复制所有内容,向下。

enter image description here

基本上,由于一些奇怪的报告要求,我需要在13(总共13行)下插入12行并将所有内容复制下来。然后,在8下插入7行(总共8行)并将所有内容复制下来。最终结果需要看起来像这样。

enter image description here

-- DDL
    CREATE TABLE Reporting_Table (
       ID    varchar(10),
       IssueDate     Date,
       ExpirationDate    Date,
       Principal     Money,
       Interest  Money,
       Qtrs      Integer,
       Calcs     Money)

INSERT INTO Reporting_Table (ID, IssueDate, ExpirationDate, Principal, Interest, Qtrs, Calcs)
VALUES ('1232949523', '01/01/2017', '12/31/2019', 1000000, .02, Null, Null); 

INSERT INTO Reporting_Table (ID, IssueDate, ExpirationDate, Principal, Interest, Qtrs, Calcs)
VALUES ('9967949523', '03/05/2017', '12/31/2018', 5200000, .01, Null, Null); 

INSERT INTO Reporting_Table (ID, IssueDate, ExpirationDate, Principal, Interest, Qtrs, Calcs)
VALUES ('1199949523', '03/31/2017', '06/01/2020', 4900000, .015, Null, Null); 

INSERT INTO Reporting_Table (ID, IssueDate, ExpirationDate, Principal, Interest, Qtrs, Calcs)
VALUES ('9567323294', '06/30/2017', '05/22/2019', 3500000, .02, Null, Null); 

INSERT INTO Reporting_Table (ID, IssueDate, ExpirationDate, Principal, Interest, Qtrs, Calcs)
VALUES ('0232949593', '09/17/2017', '11/21/2022', 2000000, .02, Null, Null);


SELECT ID, IssueDate, ExpirationDate, Principal, Interest, (Principal * Interest) As Calcs
FROM Reporting_Table

我认为SQL看起来像这样:

Select ID,IssueDate,ExpirationDate,Principal,Interest,
    year(ExpirationDate)*4 + ceiling(month(ExpirationDate)/3) - year(IssueDate)*4 - ceiling(month(IssueDate)/3) As Qrts,
    (Principal*Interest) AS Calcs
From Reporting_Table

然而,看起来这些季度有点偏差。此外,我不知道如何惰性n-1行,并在插入完成后从上向下复制数据。 我正在使用SQL Server 2008。

我知道结构是非规范化的,但是表格会非常大,所以选择应该非常快,而且,这将被送入基于网络的系统,这是非常愚蠢的,并赢得&# 39; t允许我像上面描述的那样呈现数据,所以我需要在一个基表中完成所有内容。谢谢,专家。

1 个答案:

答案 0 :(得分:2)

这可以使用递归CTE,计数表以多种方式完成。此解决方案使用master.dbo.spt_values作为计数表。我更改了列Qrts的计算,检查是否有效。

with cte as (
    Select 
        ID,IssueDate,ExpirationDate,Principal,Interest
        , Qrts = ceiling((datediff(mm, IssueDate, ExpirationDate)) / 3.0)
        , (Principal*Interest) AS Calcs
    From 
        Reporting_Table
)
select
    c.*
from
    cte c
    join master.dbo.spt_values v on c.Qrts > v.number
where
    v.type = 'P'