Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2012, 20:39   #1
иван_пропал
Пользователь
 
Регистрация: 11.10.2012
Сообщений: 10
Сообщение вычисляемые поля

Добрый день! Я новичок в sql. Имеются таблицы и связи между ними. Нужно чтобы в таблице график были вычисляемые поля:
1) дата_очередного_платежа = брать число месяца из договор.дата_выдачи и проверять прошло ли это число текущего месяца, если да то сделать следующий месяц.
2) основной_долг = договор.сумма+(договор.сумма/100)*договор.процентная_ставка
3) остаток_основного_долга = основной_долг-платежи.номер_платежа*договор.ежеме сячный_платеж
4) погашение_процента = договор.ежемесячный_платеж*вид_кред ита.процент_штрафа
5) общий_размер_платежа = договор.ежемесячный_платеж+платежи. штраф

Может это все не в виде таблицы а в виде представлений сделать? Как это все реализовать? В какую сторону хотя бы смотреть?
Хотел сделать так, но ошибка хотя таблицы договор и вид_кредита уже существуют.

Код:
create table график
(
номер_договора           int     IDENTITY (1,1)     primary key  Not null,
дата_очередного_платежа  AS   2+9   , -- доделать
основной_долг            AS  договор.сумма+(договор.сумма/100)*договор.процентная_ставка  ,
остаток_основного_долга  AS основной_долг-платежи.номер_платежа*договор.ежемесячный_платеж ,
погашение_процента       AS договор.ежемесячный_платеж*вид_кредита.процент_штрафа ,
общий_размер_платежа     AS договор.ежемесячный_платеж+платежи.штраф
foreign key (номер_договора) references договор (номер_договора)
)
sviz2.jpg
иван_пропал вне форума Ответить с цитированием
Старый 24.12.2012, 20:49   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно сделать SELECT-ом, а следовательно и вьюхой. Но
1.
Цитата:
брать число месяца из договор.дата_выдачи
т.е. не важно какая дата в дата_выдачи, главное число, год месяц побоку?
2.
Цитата:
если да то сделать следующий месяц
относительно какой даты? А если нет, тоды что?

3.Отношение между договорами и платежами один ко многим или один к одному?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.12.2012, 22:15   #3
иван_пропал
Пользователь
 
Регистрация: 11.10.2012
Сообщений: 10
По умолчанию

1. да, не важно.
2. Относительно текущей. Если нет то оставить какая есть. Пример: дата_выдачи=2010-02-02, сейчас 2012-12-25, число 02 текущего месяца прошло значит увеличить текущий месяц +1 => дата_очередного_платежа=2013-01-02
3. один ко многим

Покажите пример хотя бы одного столбца.
иван_пропал вне форума Ответить с цитированием
Старый 24.12.2012, 23:25   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
SELECT D.номер_договора,
    CASE WHEN DAY(D.дата_выдачи)<DAY(GETDATE())
      THEN DATEADD(mm,1,CONVERT(datetime,CONVERT(char(8),(YEAR(GETDATE())*100+MONTH(GETDATE()))*100+DAY(D.дата_выдачи))))
      ELSE D.дата_выдачи END AS дата_очередного_платежа,
    D.основной_долг,
    D.основной_долг-D.КоличествоПлатежей*D.ежемесячный_платеж AS остаток_основного_долга,
    D.ежемесячный_платеж*V.процент_штрафа AS погашение_процента,
    D.ежемесячный_платеж+D.ШтрафПлатежей AS общий_размер_платежа
  FROM (
    SELECT D1.номер_договора,D1.дата_выдачи,D1.ежемесячный_платеж,D1.код_вида_кредита,
        D1.сумма+(D1.сумма/100)*D1.процентная_ставка AS основной_долг,
        (SELECT COUNT(*) FROM платежи P WHERE P.номер_договора=D1.номер_договора) AS КоличествоПлатежей,
        (SELECT SUM(P.штраф) FROM платежи P WHERE P.номер_договора=D1.номер_договора) AS ШтрафПлатежей
      FROM договор D1) AS D
    LEFT JOIN вид_кредита V ON V.код_вида_кредита=D.код_вида_кредита
Как-то в этом направлении. Понятно без отладки, возможны ошибки и не малые Да, и решил что это MS SQL, видел в разделе MS SQL этот вопрос на другом форуме.
В 3 платежи.номер_платежа понял как количество платежей
В 5 платежи.штраф понял как сумму штрафов по всем платежам
Если не так понял то переделать, возможно там нужно с последним платежом работать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.12.2012 в 23:34.
Аватар вне форума Ответить с цитированием
Старый 26.12.2012, 14:36   #5
иван_пропал
Пользователь
 
Регистрация: 11.10.2012
Сообщений: 10
По умолчанию

Решел просто проэксперементировать и хотел добавить еще в начало код клиента из таблицы договор. Но почему то возникает ошибка. Почему?
Код:
SELECT D.номер_договора, D.код_клиента, 
    CASE WHEN DAY(D.дата_выдачи)<DAY(GETDATE())
      THEN DATEADD(mm,1,CONVERT(datetime,CONVERT(char(8),(YEAR(GETDATE())*100+MONTH(GETDATE()))*100+DAY(D.дата_выдачи))))
      ELSE D.дата_выдачи END AS дата_очередного_платежа,
    D.основной_долг,
    D.основной_долг-D.КоличествоПлатежей*D.ежемесячный_платеж AS остаток_основного_долга,
    D.ежемесячный_платеж*V.процент_штрафа AS погашение_процента,
    D.ежемесячный_платеж AS общий_размер_платежа
FROM (
    SELECT D1.номер_договора,D1.дата_выдачи,D1.ежемесячный_платеж,D1.код_вида_кредита,
        D1.сумма+(D1.сумма/100)*D1.процентная_ставка AS основной_долг,
        (SELECT COUNT(*) FROM платежи P WHERE P.номер_договора=D1.номер_договора) AS КоличествоПлатежей
    FROM договор D1) AS D
    LEFT JOIN вид_кредита V ON V.код_вида_кредита=D.код_вида_кредита
иван_пропал вне форума Ответить с цитированием
Старый 26.12.2012, 14:45   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

D - это данные вложенного запроса, а там такого поля нет, засуньте его туда
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычисляемые поля hunter03 Помощь студентам 5 14.12.2011 18:01
Вычисляемые поля. Masia Общие вопросы C/C++ 5 15.01.2011 00:02
Вычисляемые поля - ? Evgenii БД в Delphi 2 06.08.2009 17:03
вычисляемые поля Nikola БД в Delphi 4 19.11.2008 13:26
Вычисляемые поля Defort БД в Delphi 0 03.12.2006 11:18