Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Максимум из значений в строке(диапазона значений в строке)  [new]
mikle08es2
Member

Откуда:
Сообщений: 25
Добрый день.
Есть запрос, результатом которого является таблица см рисунок.
Заголовки столбцов:
Дни месяца
Рабочие дни,
Код предприятия,
Кол-во,
HOUR1- электропотребление в первый час суток
....
HOUR24- электропотребление в последний час суток


Необходимо последним столбцом посчитать максимальное потребление из диапазона MAX(HOUR1:HOUR24)
1)за каждые сутки
2) только за рабочие сутки


Неужели в Access нет функции расчета максимума из строчного диапазона?
Весь день думаю, никак. За любые идеи заранее спасибо.

К сообщению приложен файл. Размер - 130Kb
9 фев 19, 16:34    [21805287]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5515
mikle08es2,
А в каком виде (как выглядит таблица) Вы храните данные?
Что означает поле "count" (хорошее имя для поля)?
9 фев 19, 17:17    [21805317]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
mikle08es2
Member

Откуда:
Сообщений: 25
sdku,
Данные хранятся в виде таблицы
Столбцы которой
Дата
код предприятия
количество получасовых значений электропотребления(Count)
h1 -значения электропотребления за первые полчаса суток
.....
h48

Собственно запросом получил то, что было в первом сообщение. Теперь нужно найти макс(HOUR1:HOUR24)
9 фев 19, 17:57    [21805338]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5515
Такая функция: (и смените названия полей:date,count-это зарезервированные слова)
Function my(myDate) 'аргумент-поле с датой из Вашего запроса
Dim i, q, rash, rs As Recordset
Set rs = CurrentDb.OpenRecordset("select * from запрос1 where поле1=#" & Format(myDate, "mm\/dd\/yy") & "#")
   For i = 4 To 28 'нумерация полей начинается с 0
         rash = rs(i)
            If rash >= q Then q = rash
   Next
my = q
End Function
9 фев 19, 20:11    [21805382]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
mikle08es2
Member

Откуда:
Сообщений: 25
sdku,
А можно поподробнее запрос1 -это, я так понял мой запрос который выводит таблицу, а Поле1??? это поле датой?
9 фев 19, 21:51    [21805443]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5515
mikle08es2,
все верно: запрос1-Ваш запрос,поле1-поле с датой
приложите фрагмент БД (таблицу и запрос)покажу подробно
9 фев 19, 23:38    [21805473]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
mikle08es2
Member

Откуда:
Сообщений: 25
sdku,
С радостью бы приложил, просто очень сложная схема данных, которая подтягивает данные с внешних источников. Нужно потратить много времени, чтобы сделать локальную версию.
Еще один вопрос: Эта функция применяется выражении прямо в моем запросе( то есть в том запросе который сам получает данные из вне) или же в новом запросе, который обращается к первому запросу?
10 фев 19, 00:07    [21805485]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5515
mikle08es2,
прямо в Вашем запросе:
функция в общем модуле, а в запросе вычисляемое поле: my(полеЗапросаСдатой)
10 фев 19, 00:31    [21805491]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
mikle08es2
Member

Откуда:
Сообщений: 25
sdku,
Видимо уже не соображаю. Все так и седлал
Вычисляемое поле: my([myDate])

ругается на функцию, слишком мало параметров. требуется 2.
10 фев 19, 00:39    [21805494]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5515
SELECT ctlDate,формулаПоКоторойСчитаете as h1,....as h2,..... as h3,иТд, my(ctlDate) AS maxSytki
FROM tbl;

Важно задать такие значения счетчика в цикле FOR чтоб обращение шло к нужным полям
10 фев 19, 00:48    [21805496]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5515
Ну правильно ругается-наверное в запросе есть группировка.
"Ванговать" я не умею и пока не буду знать как в полях HOUR образуются значения и что является источником запроса ничего конкретного сказать не могу
10 фев 19, 01:53    [21805507]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
vmag
Member

Откуда: MP
Сообщений: 3104
sdku
Такая функция: (и смените названия полей:date,count-это зарезервированные слова)
Function my(myDate) 'аргумент-поле с датой из Вашего запроса
Dim i, q, rash, rs As Recordset
Set rs = CurrentDb.OpenRecordset("select * from запрос1 where поле1=#" & Format(myDate, "mm\/dd\/yy") & "#")
   For i = 4 To 28 'нумерация полей начинается с 0
         rash = rs(i)
            If rash >= q Then q = rash
   Next
my = q
End Function


-А функция то какой тип возвращает ?
my = q
- там вообще то все переменные в том числе и та что в цикле крутится As Recordset
10 фев 19, 02:02    [21805511]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
booby
Member

Откуда:
Сообщений: 1613
mikle08es2,
mikle08es2
...
Необходимо последним столбцом посчитать максимальное потребление из диапазона MAX(HOUR1:HOUR24)
1)за каждые сутки
2) только за рабочие сутки


Неужели в Access нет функции расчета максимума из строчного диапазона?
...

Прежде всего, то, что вы хотите, в access делается перекрестным запросом.
Там есть желаемый вами "максимум по строке".
для того, чтобы его составить, нужна другая структура таблицы с исходными данными.

И, прежде чем читать этот пост дальше, разберитесь с тем, как это правильно делать
в Access с использованием перекрестного запроса.
---------------------------------------------------------
---------------------------------------------------------
---------------------------------------------------------
Предположим, у вас есть разумные основания, для того,
чтобы сознательно делать это "неправильно", на основе вашей наличной структуры данных.

Этого нельзя сделать так, как вы хотите.
Потому что в строке таблицы нет диапазонов.
К полям в запросе нельзя обратиться как целому массиву,
или к "диапазону его полей" непосредственно из самого запроса.
(с оговоркой на исключение из рассмотрения предложенного вам ранее специального варианта с рекурсивным открытием рекордсета в функции)

Но можно написать функцию, принимающую произвольное число параметров, и выбирающую из них "максимум".
Если такую функцию назвать Greatest,
то обратиться к ней с первыми 10 полями hour из запроса можно будет так:
Greatest(hour1,hour2,hour3,hour4,hour5,hour6,hour7,hour8,hour9,hour10)

Для 24 полей их придется явно все перечислить.
Сокращенной записи сорта [hour1:hour24] для полей запроса нет.
Будем считать, что вы осознанно хотите явно перечислить все 24 поля.
Разберемся с реализацией.

И начнем с того, как мог бы выглядеть обычный максимум, выбирающий из двух значений.
Например, вот так:

rem  - private потому, что не планируем использовать непосредственно в запросе
Private Function max_vn(px As Variant, py As Variant) As Variant
  If px < py Then
    max_vn = py
  Else
    max_vn = px
  End If
End Function


Такой максимум не годится для непосредственного использования в запросе.
У правильного максимума, имеющего целью сравнение двух значений в одной строке
запроса может быть два варианта разумного поведения:

а) если любой из его параметров равен Null, то он возвращает Null.
Т.е. он "больше" любого числового значения.
И это традиционный вариант интерпретации Null в строке.
(максимум с произвольным числом параметров с таким поведением будем называть просто Greatest)

б) если один из параметров Null, а другой нет, то возвращается числовое значение, Null игнорируется.
В этом варианте Null "меньше" любого числового значения.
На практике мне не известно использование в стандартных реализациях строчных максимумов такого варианта поведения.
Но, так как структура ваших данных нетрадиционна, то именно такой строчный "максимум" вы и ищете.
В этом варианте Null меньше любого числового значения.
(Такой максимум с произвольным числом параметров назовем Greatest_IgnoreNull)

Начнем с обычного, "стандартного" Greatest
Понятно, что max_vn для стандартного greatest, используемого в запросе не годится.
Исправим его поведение и назовем max_vn_nonnull
+
rem  - не для использования в запросах
Private Function max_vn_nonnull(px As Variant, py As Variant) As Variant

  If IsNull(px) Or IsNull(py) Then
    max_vn_nonnull = Null
  ElseIf px < py Then
    max_vn_nonnull = py
  Else
    max_vn_nonnull = px
  End If
End Function



Тогда стандартный Greatest может выглядеть так:
+

Public Function Greatest(px As Variant, py As Variant, ParamArray pa_others() As Variant) As Variant
  
  Dim i&, j&, k&
  i = LBound(pa_others)
  j = UBound(pa_others)
  
  Greatest = max_vn_nonnull(px, py)
  
  For k = i To j
    Greatest = max_vn_nonnull(Greatest, pa_others(k))
  Next k
  
End Function



Теперь про нестандартный.
Исходный max_vn годится для нестандартного, когда первый параметр числовой, и не годится, когда первый
параметр Null.
В случае, когда достоверно известно, что именно первый параметр Null, можно поменять параметры местами в обращении к max_vn
Поэтому дописываем к max_vn такую обвязку:

+
rem  - не для использования в запросах
Private Function Max_ignoreNull(px As Variant, py As Variant) As Variant

  If Not IsNull(px) Then
    Max_ignoreNull = max_vn(px, py)
  Else
    Max_ignoreNull = max_vn(py, px)
  End If
End Function



Теперь нестандартный вариант становится таким:

+
Public Function Greatest_IgnoreNull(px As Variant, py As Variant, ParamArray pa_others() As Variant) As Variant
  Dim v_localMax As Variant
  Dim i&, j&, k&
  i = LBound(pa_others)
  j = UBound(pa_others)
  
  v_localMax = Null
  v_localMax = Max_ignoreNull(v_localMax, px)
  v_localMax = Max_ignoreNull(v_localMax, py)
      
  For k = i To j
    v_localMax = Max_ignoreNull(v_localMax, pa_others(k))
  Next k

  Greatest_IgnoreNull = v_localMax
End Function


Эта функция вернет Null, только если все переданные ей фактические параметры имеют значение Null.
10 фев 19, 06:06    [21805533]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
mikle08es2
Member

Откуда:
Сообщений: 25
booby,

booby
Прежде всего, то, что вы хотите, в access делается перекрестным запросом.
Там есть желаемый вами "максимум по строке".
для того, чтобы его составить, нужна другая структура таблицы с исходными данными.

И, прежде чем читать этот пост дальше, разберитесь с тем, как это правильно делать
в Access с использованием перекрестного запроса.



Подскажите тогда, в какой таблице необходимо хранить такого рода данные?
Есть Даты, код потребителя, количество получасовых значений электропотребления, и 48 значений электропотребления за каждые полчаса суток. Насколько мне известно перекрестным запросом можно в строке групповых операций задать только один раз значение., а у меня их 48.

Я думаю поэтому перекрестный запрос и не подходит.
10 фев 19, 12:31    [21805600]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
mikle08es2
Member

Откуда:
Сообщений: 25
sdku,


Делал, делал Вам пример, чтобы помогли разобраться. Около часа делал. Сделал. и бац все работает в примере.
Спасибо!!!

А в общей базе нет.))))

Единственное, что приходит в голову, в общей базе для выборки по датам ссылаюсь на форму с ячейками, в которых вколочены даты. Ковыряю дальше.

К сообщению приложен файл (Макс_потр.rar - 43Kb) cкачать
10 фев 19, 12:37    [21805603]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
mikle08es2
Member

Откуда:
Сообщений: 25
sdku,

Странно. Максимум ищет но не во всех строках верно.

К сообщению приложен файл (Проверка.xlsx - 24Kb) cкачать
10 фев 19, 13:22    [21805628]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
mikle08es2
Member

Откуда:
Сообщений: 25
sdku,

Совершенно не ясно почему не правильно берет максимум в некоторых строках....
10 фев 19, 16:56    [21805733]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5515
mikle08es2,
в строках где нет расхода должен быть 0 (значение по умолчанию)
до цикла FOR инициировать переменную q=0
10 фев 19, 20:14    [21805804]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
mikle08es2
Member

Откуда:
Сообщений: 25
sdku,
А как это должно помочь? Не понимаю.
10 фев 19, 21:30    [21805838]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5515
mikle08es2,
как вариант (см.форму "vybor")

К сообщению приложен файл (tmp1.rar - 28Kb) cкачать
11 фев 19, 02:23    [21805987]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
mikle08es2
Member

Откуда:
Сообщений: 25
sdku,
Спасибо за помощь, но это не совсем, что нужно.
У меня получилось верно искать максимум если во всех ячейках пустых проставить нули. Единственное, я так и не понял почему не получается сделать это при наличии пустых полей.
11 фев 19, 08:28    [21806049]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
mikle08es2
Member

Откуда:
Сообщений: 25
sdku,
Спасибо за помощь, но это не совсем, что нужно.
У меня получилось верно искать максимум если во всех ячейках пустых проставить нули. Единственное, я так и не понял почему не получается сделать это при наличии пустых полей.
11 фев 19, 09:34    [21806072]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18461
mikle08es2
почему не получается сделать это при наличии пустых полей.
Под "пустыми полями" разумеется поле со значением NULL?

Если так - то следует помнить, что проверка на это значение должны выполняться особым образом. Если с точки зрения хранения данных NULL - это "значение отсутствует", то с точки зрения обработки данных NULL - это "значение неизвестно". Или, для простоты понимания - "фиг знает". И по этой причине любое действие с NULL даёт NULL - и сравнение (равны ли единица и "фиг знает"? а фиг знает...), и, скажем, сложение (чему равно единица плюс "фиг знает"? а фиг знает...).

NULL в качестве результата сравнения интерпретируется как False - потому что всё, что не гарантирует True, есть False. И если в длинной цепи проверок затесался хотя бы один NULL - он, как вирус, расползётся по всему выражению. И окончательным итогом окажется NULL. Который, как сказано выше, False.

А потому, если значение поля может быть NULL, необходимо либо добавлять соответствующую проверку (WHERE поле = что-то OR поле IS NULL), либо конвертировать NULL в конкретное определённое значение (WHERE IFNULL(поле, что-то_особенное) = что-то).
11 фев 19, 09:57    [21806096]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5515
mikle08es2
...Единственное, я так и не понял почему не получается сделать это при наличии пустых полей.
потому что NULL<>0 (не больше и не меньше-просто ничто.Ведь в Ёкселе,при автосуммировании значение NULL преобразуется в 0 только происходит это молча-по умолчанию) и существует ряд способов не отображать 0 в поле формы,сохраняя это значение в поле таблицы (функции NZ,IIF)
В предложенном варианте хранения данных создание запросов(подобных открывшему топик) не вызовет затруднений
Сам запрос:(Функцию определения максимального расхода сочините сами по аналогии с процедурой)
TRANSFORM IIf(Sum([rashod])=0,"",Sum([rashod])) AS Выражение1
SELECT glavnaia.Rdata, organiz.naim
FROM organiz INNER JOIN (glavnaia INNER JOIN rashod ON glavnaia.IdGl = rashod.IdGl) ON organiz.naim = glavnaia.organiz
GROUP BY glavnaia.Rdata, organiz.naim
PIVOT "h" & Left([po],InStr([po],":")-1) In ("h0","h1","h2","h3","h4","h5","h6","h7","h8","h9","h10","h11","h12","h13","h14","h15","h16","h17","h18","h19","h20","h21","h22","h23");
11 фев 19, 12:54    [21806294]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5515
booby
Прежде всего, то, что вы хотите, в access делается перекрестным запросом.
Там есть желаемый вами "максимум по строке".
Интересно:и хде же он? Ведь в перекрестном запросе "значение" это результат групповой операции (например SUM) и MAX по этому полю в заголовке строк даст наибольшее слагаемое из которых состоят "значения" отображаемые в строке, а MAX(SUM(..)) применить не удастся
11 фев 19, 13:43    [21806363]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft Access Ответить