sql - 我可以使用 SQL 根据计划信息绘制实际日期吗?

标签 sql sql-server sql-server-2005 tsql

如果我有一个包含暗示特定日期的日程表信息的表,是否可以编写一个 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/

相关文章:

mysql - SQL SELECT * FROM tbl(隐藏 1 列)

sql - mysql 获取 order by 发生在 group by 之前

SQL : how to find leaf rows?

sql - 如何在SQL Server 2005中实现高性能 TreeView

sql - 由两个不同的 GROUP BY 求和

sql - 选择列上的 MAX,然后从依赖于第一个值的列中选择 MAX

SQL GROUP BY 一列的不同值

PHP/MYSQL 点单

c# - 将DataTable中的数据插入到数据库表中

sql - mysql 5.0 的 GUI 工具