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

Sql 如何找到两个日期之间的总季度数并复制数据n-1次?,sql,sql-server,Sql,Sql Server,我有一个表,看起来像下图,但是还有几个字段(额外的字段基本上是不相关的;尽量保持简单) 我想计算季度数和利息*本金,但问题是…我需要插入与季度数相同的行数,然后从上到下复制所有内容 基本上,由于一些奇怪的报告要求,我需要在13行下面插入12行(总共13行),然后将所有内容都复制下来。然后,在8行下插入7行(总共8行),并将所有内容向下复制。最终结果需要如下所示 我认为SQL将如下所示: Select ID,IssueDate,ExpirationDate,Principal,Interes

我有一个表,看起来像下图,但是还有几个字段(额外的字段基本上是不相关的;尽量保持简单)

我想计算季度数和利息*本金,但问题是…我需要插入与季度数相同的行数,然后从上到下复制所有内容

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

我认为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。


我知道这个结构是非常非规范化的,但是表将非常大,所以选择应该非常快,而且,这将被输入到一个基于web的系统中,这是非常愚蠢的,并且不允许我像上面描述的那样呈现数据,所以我需要在一个基表中完成所有事情。谢谢,专家们。

这可以通过使用递归CTE、理货表通过几种方式完成。此解决方案使用
master.dbo.spt\u值作为计数表。我已经更改了列QRT的计算,请检查是否有效

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'

这可以通过使用递归CTE、计数表的几种方式来实现。此解决方案使用
master.dbo.spt\u值作为计数表。我已经更改了列QRT的计算,请检查是否有效

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'

对,对,对!!我想这就行了。谢谢我知道这是一个CTE,但我从来都不擅长这些东西。子查询的作用似乎与:with cte…from cte c。我猜所有的魔法都来自于:加入大师…'p'。至少对我来说,这部分在做什么并不明显。你是对的!我使用CTE只是为了让它更容易理解
master.dbo.spt_值
将每行乘以
Qrts
fieldYes,yes,yes!我想这就行了。谢谢我知道这是一个CTE,但我从来都不擅长这些东西。子查询的作用似乎与:with cte…from cte c。我猜所有的魔法都来自于:加入大师…'p'。至少对我来说,这部分在做什么并不明显。你是对的!我使用CTE只是为了让它更容易理解
master.dbo.spt_值
将每行乘以
Qrts
字段的值