арифметические действия в ACCESS...???

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Евгений В.
Сообщения: 4
Зарегистрирован: 07 май 2009, 09:20

Продолжу поддерживать тему арифметических операций в MS Access.
И это буду осуществлять следующим вопросом.

С арифметическими действиями, так сказать, построчными (ну, т.е. как в примере выше) всё предельно ясно.

А вот как поступить, если мне нужно от числа следующей строки вычесть число текущей строки. Т.е. найти разницу этих строк. Вот это и есть моя проблема. Листаю книжки по sql, да никак не могу в голове для себя проблему сформулировать, что б её в книги отыскать. Голова на раскоряку.

Заранее спасибо.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Тут сначала вам надо разобраться что такое "следующая строка" ?
Запись с ID минимально большим чем у текущей ?
ACCESS реляционная СУБД. Отношение порядка для строк в общем случае может быть весьма причудливым ...
Андрей Энтелис,
aentelis.livejournal.com
Евгений В.
Сообщения: 4
Зарегистрирован: 07 май 2009, 09:20

Ну, вот в том-то и дело. Я изначально предполагал, что здесь работать нужно с номером строки. Но вопрос мой как раз и заключался в том, каким образом в Access можно работать с этими ID строк. Такие дела. :confused:
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Беспредметный разговор. Опишите Ваш конкретный пример.
В любом случае выполнить вычисления "вертикально", т.е. между строками можно только с помощью агрегатных функций (sum, avg, count...).

select sum(F5) from t1 - сумма всех значений поля F5

select sum(F5) from t1 where <усл> - сумма всех значений поля F5 для записей, удовлетворяющих условию

select F2,sum(F5) from t1 group by F2 - t1 разбивается на группы (одинаковое значение поля F2 означает принадлежность к группе). Сумма считается для каждой группы отдельно

select F2,sum(F5) from t1 group by F2 having <усл> - то же, но из групп выбираются только группы, удовлетворяющие условию
Евгений В.
Сообщения: 4
Зарегистрирован: 07 май 2009, 09:20

Спасибо большое. По крайней мере я теперь представляю себе в каком направлении нужно искать.

А сама задача такова. Для Excel - обычное дело. Только в Access я этого не делал.

Есть столбец данных, а именно показания счетчиков за каждый месяц. Я хочу сформировать второй столбец, в который будет записан РАСХОД энергии за каждый месяц. Т.е. разница между последующим и текущим элементами столбца. Думал как-то привязаться к порядковому номеру строки, но как это осуществить так и не откопал. :confused:
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

И для Access это не меняя пустяковая задача, чем для Excel.
И у нее есть несколько способов решения, отличающихся друг от друга кардинально.
Вcе зависит от того, как Вы храните дату. Используете ли стандартный тип Date или просто 2 целочисленных поля Year и Month? Я не понимаю, что Вы структуру таблицы-то держите в секрете? :) Уже давно бы Вам тут все способы разжевали....
Евгений В.
Сообщения: 4
Зарегистрирован: 07 май 2009, 09:20

Да не-е-е... В секрете я ничего и не держу. Просто не хотел лишней информацией людей перегружать.

Ну так вот. Суть такая. Каждый месяц в здании снимаются показания счётчиков электроэнергии. Эти показания заносятся в базу. Для выставления счетов арендаторам необходимо вычислить разницу между текущими и предыдущими показаниями (чтобы расход вычислить). Ну, а далее, используя отчёты, печатать счета на оплату, статистику и т.п.

Вторая таблица - таблица с проведёнными расчётами. Первый столбец: Месяц. Второй: Расход. Конечно, можно всё и в одной таблице, думаю, сделать (просто столбцы добавить), но пусть будет пока так, а там уж и оптимизировать буду.

Первая таблица - таблица с показаниями. Первый столбец: Дата. Второй: Показания.
Дата записывается по маске ##.##.#### из которой я и предполагал выдернуть только месяц и вставить его в текстовом виде во вторую таблицу.

Ну, вот собственно и всё. Всё максимально прозрачно. Вот только как заставить вычислять строки по вертикали - это и есть моя проблема о которой я и говорил.
Ну, в общем, так... :)
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Эх... Таблицы и поля как называются?
Вобщем, пусть таблица называется Counter
и там 2 поля:
Date - типа дата
Value - целое число
На таблицу накладывается ограничение Day([Date])=1 (кнопка свойства в конструкторе таблиц). Это чтобы можно было вводить только даты на 1 число месяца.

вот запрос

Код: Выделить всё

select 
   c1.date as DtFrom,  c2.date as DtTo , 
   c1.value as Val1, c2.value as Val2,   
   Val2-Vla1 as ValueToCharge
from 
   counter as c1 inner join counter as c2 
   on c2.date=dateadd('m',1,c1.date)

Здесь таблица с1 (она же Counter) является ведущей
Из нее берутся значения DtFrom и Val1 (дата и показание соответственно). "AS XXX" - это псевдонимы.

К каждой записи присовокупливается запись из таблицы C2(физически это все та же самая Counter), такая, что поле Date там на 1 месяц больше (c2.date=dateadd('m',1,c1.date))
Берутся значения DtTo и Val2 (т.е. те же дата и показание)

Получается такая выборка из пяти колонок:

DtFrom; DtTo; Val1; Val2; ValueToCharge

ValueToCharge (значение для начислений) = Val2-Val1

Также вместо JOIN можно то же самое сделать вложенными запросами.
Ответить