арифметические действия в ACCESS...???
Модератор: Naeel Maqsudov
-
- Сообщения: 4
- Зарегистрирован: 07 май 2009, 09:20
Продолжу поддерживать тему арифметических операций в MS Access.
И это буду осуществлять следующим вопросом.
С арифметическими действиями, так сказать, построчными (ну, т.е. как в примере выше) всё предельно ясно.
А вот как поступить, если мне нужно от числа следующей строки вычесть число текущей строки. Т.е. найти разницу этих строк. Вот это и есть моя проблема. Листаю книжки по sql, да никак не могу в голове для себя проблему сформулировать, что б её в книги отыскать. Голова на раскоряку.
Заранее спасибо.
И это буду осуществлять следующим вопросом.
С арифметическими действиями, так сказать, построчными (ну, т.е. как в примере выше) всё предельно ясно.
А вот как поступить, если мне нужно от числа следующей строки вычесть число текущей строки. Т.е. найти разницу этих строк. Вот это и есть моя проблема. Листаю книжки по sql, да никак не могу в голове для себя проблему сформулировать, что б её в книги отыскать. Голова на раскоряку.
Заранее спасибо.
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
Тут сначала вам надо разобраться что такое "следующая строка" ?
Запись с ID минимально большим чем у текущей ?
ACCESS реляционная СУБД. Отношение порядка для строк в общем случае может быть весьма причудливым ...
Запись с ID минимально большим чем у текущей ?
ACCESS реляционная СУБД. Отношение порядка для строк в общем случае может быть весьма причудливым ...
Андрей Энтелис,
aentelis.livejournal.com
aentelis.livejournal.com
-
- Сообщения: 4
- Зарегистрирован: 07 май 2009, 09:20
Ну, вот в том-то и дело. Я изначально предполагал, что здесь работать нужно с номером строки. Но вопрос мой как раз и заключался в том, каким образом в Access можно работать с этими ID строк. Такие дела. 

- 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 <усл> - то же, но из групп выбираются только группы, удовлетворяющие условию
В любом случае выполнить вычисления "вертикально", т.е. между строками можно только с помощью агрегатных функций (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 я этого не делал.
Есть столбец данных, а именно показания счетчиков за каждый месяц. Я хочу сформировать второй столбец, в который будет записан РАСХОД энергии за каждый месяц. Т.е. разница между последующим и текущим элементами столбца. Думал как-то привязаться к порядковому номеру строки, но как это осуществить так и не откопал.
А сама задача такова. Для Excel - обычное дело. Только в Access я этого не делал.
Есть столбец данных, а именно показания счетчиков за каждый месяц. Я хочу сформировать второй столбец, в который будет записан РАСХОД энергии за каждый месяц. Т.е. разница между последующим и текущим элементами столбца. Думал как-то привязаться к порядковому номеру строки, но как это осуществить так и не откопал.

- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
И для Access это не меняя пустяковая задача, чем для Excel.
И у нее есть несколько способов решения, отличающихся друг от друга кардинально.
Вcе зависит от того, как Вы храните дату. Используете ли стандартный тип Date или просто 2 целочисленных поля Year и Month? Я не понимаю, что Вы структуру таблицы-то держите в секрете?
Уже давно бы Вам тут все способы разжевали....
И у нее есть несколько способов решения, отличающихся друг от друга кардинально.
В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 число месяца.
вот запрос
Здесь таблица с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 можно то же самое сделать вложенными запросами.
Вобщем, пусть таблица называется 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)
Из нее берутся значения 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 можно то же самое сделать вложенными запросами.