Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Работа с датами в Access (Плиииз!)


Автор: Dinchik 8.2.2006, 17:36
Сортируем данные из БД по сроку действия. При этом, нужны сроки:
1 день
от 2 до 7 дней
от 7 до 14 дней
от 15 до 1 месяц
от 1 до 2 месяц
1 год 15 дней
1 год 6 месяцев

В БД имеются поля (Остаток, Дата начала договора,Дата окончания договора,% ставка)

Нужны след. поля:
1. Столбец "сумма остатков" - просуммированные остатки со сроком действия, например, на 1 день.
2. Столбцы "Средневзвешенный процент" и "Средневзвешенный срок" - значения ячеек столбцов вычисляются по формуле вычисления сред.взв. значений. В данной таблице, это умножение соответствующей ячейки столбца "Остаток" на соотв. ячейку столбца "Проценты" ((или на разницу "Дата окон." и "Дата нач.") и записываем все вычисления в столбец ср.взв. процент, находим сумму из столбца ср.взв. процент (или срок, в случае вычисления ср.взв. срока) делим на среднюю "остаток" что будет равно ср.взв.-ному процента или срока.

Вот такие дела, не получается найти средневзвешенный срок, т.к. не могу просуммировать в программе например все дни между 2 и 7. ПОМОГИТЕ ПЛИЗ!!! smile (срочно!!!!!!!!!!!!!!!!!!!!!!!)

Автор: nworm 8.2.2006, 18:23
Не понял. smile

Можно пример с маленькой таблицей. Что дано (таблица), что должно получиться (таблица) и что не получается?

Автор: Akina 8.2.2006, 19:16
Создай вспомогательную таблицу "интервал" типа
Код
ID Min Max
 1  0   1
 2  2   7
 3  8  14
......
и делай что-то типа
Код
SELECT Sum(БД.остаток) As Sum_остаток, Инт.ID
FROM БД, Инт
WHERE (БД.Конец-БД.Начало) between Инт.Min AND Инт.Max
GROUP BY Инт.ID

Автор: Dinchik 10.2.2006, 20:39
Привет Всем помогающим!
В общем из таблицы нужно вывести таблицу вот...а не получается у меня найти средневзвешенный срок!Например, программа вытаскивает сумму остатков на срок от 2 до 7 дней, но не может найти срвзв срок, т.е. я не могу задать точные функции или формулу...в общем такую детализацию программа не расчитывает!!!
Добавлено @ 20:47
WHERE (БД.Конец-БД.Начало) between Инт.Min AND Инт.Max
Это тоже плохо помогает
у меня в программе так и идет, она вытаскивает все остатки между этими сроками и суммирует как я и задаю. Но не могу также найти срвзв. срок. Т.е. соотв. ячейку остатков умножить на разницу сроков (БД.Конец-БД.Начало) соотв. ячеек в отд. столбце. После этого сумму нового столбца разделить на сумму столбца остатков!
Может у Вас получится smile

Автор: Akina 10.2.2006, 23:39
Dinchik
Знаешь, если я буду сокращать код так же, как ты свой постинг - ты никогда и ничего не поймешь. Будь уж так любезен поправить.

И еще - найди человека, который про твою задачу НИЧЕГО не знает. Прочти (или дай прочесть) ему то что ты написАл. И посмотри, поймет он или нет. Думаю что нет. То, что очевидно тебе, вовсе не очевидно остальным - постарайся найти слова и формулировки, которые понятны и не допускают двоякого толкования. Тогда станет возможным тебе помочь.

PS. Я уже почти знаю как - но не уверен что правильно понял твои объяснения. Так что подожду...

Автор: Dinchik 11.2.2006, 22:49
Privet Akina!

В общем нужно найти "Средневзвешенный срок" - это находится следующим образом:
умножаем все ячейки столбца "Остаток" на разницу столбцов "Дата нач и Дата окон." и получаем 3 столбец, потом сумму вычисленного столбца делим на сумму столбца "остаток" что будет равно ср.взв. сроку.

Надеюсь, это понятно

Автор: nworm 11.2.2006, 22:59
А можно всё-таки пример?

Автор: Akina 13.2.2006, 10:23
Dinchik
В таком случае сначала создай запрос, который выбирает все записи и все поля, и кроме того для каждой записи вычисляет дополнительные поля, т.е. интервал ( ДатаКон-ДатаНач ) и заготовку для расчета твоего средневзвешенного срока ( (ДатаКон-ДатаНач)*Остаток ). И именно его, а не исходную таблицу, используй для расчета.
Когда поймешь как это работает, и отладишь - просто пересобери 2 запроса в один.

Автор: Dinchik 14.2.2006, 17:44
Akina,
а если сразу то могут быть ошибки в вычислениях?
У меня сумма исходной таблицы и сумма вычисленной не сходятся, не могу найти ошибку.
Наверное надо сначала разбить как ты говоришь...ммм....
спасибо за совет!

Автор: Akina 14.2.2006, 18:24
Цитата(Dinchik @ 14.2.2006, 18:44 Найти цитируемый пост)
а если сразу то могут быть ошибки в вычислениях?У меня сумма исходной таблицы и сумма вычисленной не сходятся, не могу найти ошибку.

чудес не бывает... выведи количество записей в каждом случае - для начала.

PS. Это вообще хорошая практика - на время отладки во все группирующие запросы дополнительно вводить подсчет Count... а по поводу вложенных запросов - посмотри принцип http://forum.vingrad.ru/index.php?showtopic=72511. Лучше изгадить пару листов, чем искать ошибку в каком-нить трехэтажном безобразии...

Автор: Dinchik 15.2.2006, 16:06
Akina
после применения вашего совета возникла еще одна проблема
в общем сумма остатков исходной таблицы и сумма остатков расчетной таблицы не сходятся
я думаю что ошибка отсюда:
'1 день' =1;
'7 дней' = between 1 and 7;
'14 дней' = between 8 and 14;
'1 месяц' = between 15 and 31;
'2 месяца' = between 32 and 61;
'3 месяца' = between 62 and 92;
'4 месяца' = between 93 and 122;
'5 месяцев' = between 123 and 154;
'6 месяцев' = between 155 and 183;
'7 месяцев' = between 184 and 214;
'8 месяцев' = between 215 and 244;
'9 месяцев' = between 245 and 275;
'10 месяцев' = between 276 and 305;
'11 месяцев' =between 306 and 335;
'1 год' = between 336 and 366;
'1 год 15 дней' = between 367 and 381;
'1 год 6 месяцев' = between 382 and 548;
'2 года' = between 549 and 733;
'3 года' = between 734 and 1096;
'4 года' = between 1097 and 1462;
'5 лет' = between 1463 and 1827;
'6 лет' = between 1828 and 2193;
'7 лет' = between 2194 and 2558;
'8 лет' = between 2559 and 2924;
'9 лет' = between 2925 and 3289;
'10 лет' = between 3290 and 3655;
'свыше 10 лет' = 3656 and 7310;
Правильно ли это?Помогите плииииз!!!! а то я с этой задачей спать перестану, когда же я его закончу????????????????????????? smile

Автор: Akina 15.2.2006, 17:35
Dinchik
Очень хочется обозвать нехорошим словом, означающим человека, не желающего думать.

Посмотри ВНИМАТЕЛЬНО на пример вспомогательной таблицы, который я привел выше. ОЧЕНЬ ВНИМАТЕЛЬНО. И сравни с тем что ты натворил. Особенно в самом начале и в самом конце.

Автор: Dinchik 15.2.2006, 21:14
Akina
я ничего не поняла, причем здесь мин. и макс.
в общем Вы можете объяснить так, чтобы я поняла?(это моя первая подобная программа)
и как вообще будет правильно? отправляю Вам код в прикр. файле

Автор: Akina 16.2.2006, 00:18
Цитата(Dinchik @ 15.2.2006, 17:06 Найти цитируемый пост)
'7 дней' = between 1 and 7;

Ошибка номер раз - от 2 до 7. Иначе 1 день - попадает в 2 диапазона.

Цитата(Dinchik @ 15.2.2006, 17:06 Найти цитируемый пост)
'свыше 10 лет' = 3656 and 7310;

Ошибка номер два - от 3656 до MaxInt (MaxLong). Иначе более 7310 дней - не учитывается.

Автор: Dinchik 16.2.2006, 09:53
значит остальной правильно?
попробую щас

Автор: Dinchik 16.2.2006, 20:14
В общем все у меня было правильно кроме первого срока, т.е. в таблице были сроки меньше 1 дня.
а самый последний срок поставила на максимум, но оттуда ничего не добавилось
СПАСИБО за советы!!!!!!!!!!!!!! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)