我的表格看起来像下面的图片,但是还有一些字段(额外的字段基本上无关紧要;试图保持这个简单)。
我想计算季度和兴趣*校长,但扭曲是......我需要插入与宿舍相同数量的行,并从上面复制所有内容,向下。
基本上,由于一些奇怪的报告要求,我需要在13(总共13行)下插入12行并将所有内容复制下来。然后,在8下插入7行(总共8行)并将所有内容复制下来。最终结果需要看起来像这样。
-- 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允许我像上面描述的那样呈现数据,所以我需要在一个基表中完成所有内容。谢谢,专家。
答案 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'