Могу ли я использовать SQL для отображения фактических дат на основе информации о расписании? - PullRequest
3 голосов
/ 05 марта 2009

Если у меня есть таблица, содержащая информацию о расписании, которая подразумевает конкретные даты, есть ли инструкция SQL, которая может быть записана для преобразования этой информации в реальные строки, возможно, с использованием какого-либо типа CROSS JOIN?

Рассмотрим таблицу графика платежей со следующими столбцами:

  • 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. Мы не так отстали, как я думал. К сожалению.

Ответы [ 4 ]

2 голосов
/ 05 марта 2009

Я не могу проверить код прямо сейчас, поэтому возьмите его с щепоткой соли, но я думаю, что что-то похожее на следующее должно ответить на вопрос:

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
1 голос
/ 05 марта 2009

Попробуйте использовать таблицу целых чисел (или лучше это: http://www.sql -server-helper.com / functions / integer-table.aspx ) и небольшую дату по математике, например ... start + int * freq

1 голос
/ 05 марта 2009

Я использовал табличные функции для достижения аналогичного результата. По сути, это то же самое, что и использование табличной переменной, которую я знаю, но я помню, что действительно доволен дизайном.

Использование заканчивается очень хорошим чтением, на мой взгляд:

/* assumes @startdate and @enddate schedule limits */

SELECT
   p.paymentid,
   ps.paymentnum,
   ps.duedate,
   ps.ret
FROM
   payment p,
   dbo.FUNC_get_payment_schedule(p.paymentid, @startdate, @enddate) ps
ORDER BY p.paymentid, ps.paymentnum
0 голосов
/ 05 марта 2009

Типичным решением является использование таблицы календаря. Вы можете расширить его в соответствии со своими потребностями, но это будет выглядеть примерно так:

CREATE TABLE Calendar
(
     calendar_date DATETIME NOT NULL,
     is_holiday BIT NOT NULL DEFAULT(0),
     CONSTRAINT PK_Calendar PRIMARY KEY CLUSTERED calendar_date
)

В дополнение к is_holiday вы можете добавить другие релевантные для вас столбцы. Вы можете написать скрипт для заполнения таблицы в течение следующих 10, 100 или 1000 лет, и у вас все должно быть готово Это делает такие запросы, которые вы пытаетесь сделать, намного проще и может дать вам дополнительную функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...