如果我有一个包含暗示特定日期的日程表信息的表,是否可以编写一个 SQL 语句来将该信息转换为实际行,也许使用某种交叉连接?
考虑一个包含这些列的付款计划表:
- StartDate - 计划开始的日期(第一笔付款应在此日期支付)
- 期限 - 计划的长度(以月为单位)
- 频率 - 复发之间的月数
- PaymentAmt - 付款金额:-)
SchedID StartDate Term Frequency PaymentAmt ------------------------------------------------- 1 05-Jan-2003 48 12 1000.00 2 20-Dec-2008 42 6 25.00
是否有一个 SQL 语句可以让我从上面转到下面?
Running SchedID Payment Due Expected Num Date Total -------------------------------------- 1 1 05-Jan-2003 1000.00 1 2 05-Jan-2004 2000.00 1 3 05-Jan-2005 3000.00 1 4 05-Jan-2006 4000.00 1 5 05-Jan-2007 5000.00 2 1 20-Dec-2008 25.00 2 2 20-Jun-2009 50.00 2 3 20-Dec-2009 75.00 2 4 20-Jun-2010 100.00 2 5 20-Dec-2010 125.00 2 6 20-Jun-2011 150.00 2 7 20-Dec-2011 175.00
我正在使用 MS SQL Server 2005(没有希望很快升级)并且我已经可以使用表变量和 while 循环来执行此操作,但似乎某种 CROSS JOIN 会适用,但我不知道这可能如何运作。
感谢您的想法。
编辑:我实际上使用的是 SQL Server 2005,虽然我最初说的是 2000。我们并没有我想象的那么落后。抱歉。
最佳答案
我现在无法测试代码,所以请稍加保留,但我认为看起来或多或少像下面这样的东西应该可以回答这个问题:
with q(SchedId, PaymentNum, DueDate, RunningExpectedTotal) as
(select SchedId,
1 as PaymentNum,
StartDate as DueDate,
PaymentAmt as RunningExpectedTotal
from PaymentScheduleTable
union all
select q.SchedId,
1 + q.PaymentNum as PaymentNum,
DATEADD(month, s.Frequency, q.DueDate) as DueDate,
q.RunningExpectedTotal + s.PaymentAmt as RunningExpectedTotal
from q
inner join PaymentScheduleTable s
on s.SchedId = q.SchedId
where q.PaymentNum <= s.Term / s.Frequency)
select *
from q
order by SchedId, PaymentNum
关于sql - 我可以使用 SQL 根据计划信息绘制实际日期吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/612480/