powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / простая арифметика? не могу решить :о((
17 сообщений из 17, страница 1 из 1
простая арифметика? не могу решить :о((
    #37977719
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер, профи!

у меня в таблице есть поле "km_mark" - хранит пробег автомобиля посуточно наростающим итогом, т.е.
90256, 90563, 90897 и т.д.
Мне нужно чтобы запрос высчитывал суточный пробег.
Прошу помочь составить запрос.

Спасибо!
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37977738
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labirintДобрый вечер, профи!

у меня в таблице есть поле "km_mark" - хранит пробег автомобиля посуточно наростающим итогом, т.е.
90256, 90563, 90897 и т.д.
Мне нужно чтобы запрос высчитывал суточный пробег.
Прошу помочь составить запрос.

Спасибо!
сумму по дате делаешь да и все
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37977753
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ImperouslabirintДобрый вечер, профи!

у меня в таблице есть поле "km_mark" - хранит пробег автомобиля посуточно наростающим итогом, т.е.
90256, 90563, 90897 и т.д.
Мне нужно чтобы запрос высчитывал суточный пробег.
Прошу помочь составить запрос.

Спасибо!
сумму по дате делаешь да и все

Не совсем понятно. В поле от записи к записи - на каждую новую дату - и так число увеличивается, а что даст, если я просуммирую?
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37977794
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так
Код: sql
1.
2.
select count(*) as nDay, max(km_mark) as nEnd, min(km_mark) as nMin from MyTable into cursor tResult
? (tResult.nMax - tResult.nMin) / tResult.nDay
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37977803
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labirint,

Dima TКак-то так
Код: sql
1.
2.
select count(*) as nDay, max(km_mark) as nEnd, min(km_mark) as nMin from MyTable into cursor tResult
? (tResult.nMax - tResult.nMin) / tResult.nDay

Так мы получим среднесуточный пробег.

Для получения посуточного пробега можно попробовать без запроса, в цикле (tResult делаем руками):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select MyTable
go top
scan
  nN=MyTable.km_mark
  skip
  if eof()
    exit
  endif
  nK=MyTable.km_mark
  insert into tResult (km_day) values nK - nN	
endscan
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37977817
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonny540Так мы получим среднесуточный пробег.
Точно, невнимательно вопрос прочитал.

В твоем примере SCAN на DO WHILE надо заменить
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select MyTable
go top
do while .T.
  nN=MyTable.km_mark
  skip
  if eof()
    exit
  endif
  nK=MyTable.km_mark
  insert into tResult (km_day) values nK - nN	
enddo



Со сканом так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
sele MyTable
go top
lnPrevKm = MyTable.km_day
skip
scan while .T.
    insert into tResult (km_day) values (MyTable.km_day - lnPrevKm)
    lnPrevKm = MyTable.km_day
endscan



PS в обоих случаях порядок сортировки должен быть по возрастанию km_day
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37977829
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labirint,
В варианте Jonny540 таблица должна быть проиндексирована по дате
Вот вариант без скана.
Код: sql
1.
2.
3.
4.
5.
6.
SELECT (b.km_mark-a.km_mark) as km ,a.dt ;
	FROM (SELECT dt,km_mark,RECNO() as rn from trkm ORDER BY dt) as a;
	INNER JOIN ;
	(SELECT dt,km_mark,RECNO() as rn from trkm ORDER BY dt) as b ;
	ON a.rn+1 = b.rn;
	ORDER BY a.dt INTO CURSOR res
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37978026
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asdorlabirint,
В варианте Jonny540 таблица должна быть проиндексирована по дате

В твоем варианте таблица должна быть физически упорядочена по дате.
RECNO() вернет физический номер записи в trkm.
Если захочешь предлагать еще варианты с RECNO() - учти также помеченные на удаление :)
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37978521
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВ твоем варианте таблица должна быть физически упорядочена по дате.
RECNO() вернет физический номер записи в trkm.

А ведь точно, не подумал)
Я то думал, она на лету, проставит № создаваемой записи)))
Просто для запроса необходим упорядоченный идентификатор.
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37979142
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asdorlabirint,
В варианте Jonny540 таблица должна быть проиндексирована по датеСобственно, это и предполагалось, если судить по вопросу ТС.

Да, я еще должен извиниться за неправильную цитату:
Jonny540насчет Паскаля ... его изучение в свое время "калечило ум" (с) по утверждению профессора Дейкстры.Это он о КОБОЛЕ
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37979239
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то, аггрегатные функции вполне можно вычетать непосредственно в запросе

Код: sql
1.
2.
3.
select День, max(Пробег) - min(Пробег) as Пробег ;
from MyTable ;
group by День
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37979271
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только что дошло, что в каждой записи значение на новую дату :) Т.е. надо из значения последующей записи вычесть значение предыдущей

Если даты идут без разрывов (нет пропусков дат), то можно просто сделать объединение по условию (Дата + 1)

Код: sql
1.
2.
3.
select t1.Дата, (t1.km_mark - NVL(t2.km_mark,0)) as Пробег ;
from MyTable t1 ;
left join MyTable t2 on t1.Дата = t2.Дата - 1



Если же решать задачу в общем случае, то можно так

Код: sql
1.
2.
3.
4.
5.
select t1.Дата, (t1.km_mark - NVL(Min(t2.km_mark),0)) as Пробег ;
from MyTable t1 ;
left join MyTable t2 on t2.Дата < t1.Дата ;
group by t1.Дата, t1.km_mark ;
order by t1.Дата
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37979443
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМТолько что дошло, что в каждой записи значение на новую дату :) Т.е. надо из значения последующей записи вычесть значение предыдущей

Если даты идут без разрывов (нет пропусков дат), то можно просто сделать объединение по условию (Дата + 1)

Код: sql
1.
2.
3.
select t1.Дата, (t1.km_mark - NVL(t2.km_mark,0)) as Пробег ;
from MyTable t1 ;
left join MyTable t2 on t1.Дата = t2.Дата - 1




Друзья! Всем огромное спасибо!

Сделал как в этом комменте Владимира - все работает! :о))))
Только выводит отрицательные значения, изменил
Код: sql
1.
left join MyTable t2 on t1.Дата - 1 = t2.Дата


стало нормально.
Спасибо!!!
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37979509
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labirintСделал как в этом комменте Владимира - все работает! :о))))
Только выводит отрицательные значения, изменил
Код: sql
1.
left join MyTable t2 on t1.Дата - 1 = t2.Дата


стало нормально.
Спасибо!!!
Следи теперь чтоб даты шли последовательно, без пропусков и повторов. Один пропуск или повтор и все сглючит.
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37980032
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TlabirintСделал как в этом комменте Владимира - все работает! :о))))
Только выводит отрицательные значения, изменил
Код: sql
1.
left join MyTable t2 on t1.Дата - 1 = t2.Дата


стало нормально.
Спасибо!!!
Следи теперь чтоб даты шли последовательно, без пропусков и повторов. Один пропуск или повтор и все сглючит.

ОК, прослежу.
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37980275
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labirintОК, прослежу.
Не разумнее ли использовать 2й вариант предложенный Владимиром?
...
Рейтинг: 0 / 0
простая арифметика? не могу решить :о((
    #37987350
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asdorlabirintОК, прослежу.
Не разумнее ли использовать 2й вариант предложенный Владимиром?

Может и разумнее, я его не понимаю :о(( - как сопоставлены 2 таблицы? Если в первом четко ясно, что смещение по дате на 1, то во 2-м - как?
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / простая арифметика? не могу решить :о((
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]