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

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


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


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

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

Откуда: Краснодар
Сообщений: 5671
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

Откуда: Краснодар
Сообщений: 5671
Такая функция: (и смените названия полей: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

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

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

Откуда: Краснодар
Сообщений: 5671
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

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

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

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

Откуда: MP
Сообщений: 3139
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

Откуда:
Сообщений: 1615
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

Откуда: Краснодар
Сообщений: 5671
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

Откуда: Краснодар
Сообщений: 5671
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

Откуда: Зеленоград, Москва, Россия
Сообщений: 18775
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

Откуда: Краснодар
Сообщений: 5671
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

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

Откуда: Зеленоград, Москва, Россия
Сообщений: 18775
Вот интересно, дойдёт ли автор до понимания, что нужно нормализовать исходные данные, уйдя от этой нелепой структуры хранения? хотя бы для того, чтобы избавиться от всех проистекающих из неё трудностей и, как следствие, набора кривых костылей...
11 фев 19, 15:13    [21806508]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
Лапух
Member

Откуда:
Сообщений: 775
Akina
...чтобы избавиться от всех проистекающих из неё трудностей и, как следствие, набора кривых костылей...

Многие считають, что на костылях - Забавнее и Интереснее.
Некоторым даже милостыню подают.
11 фев 19, 15:20    [21806516]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
mikle08es2
Member

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

Так подскажите как хранить такие данные????
11 фев 19, 18:45    [21806797]     Ответить | Цитировать Сообщить модератору
 Re: Максимум из значений в строке(диапазона значений в строке)  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5671
mikle08es2,
Хотя-бы так.Чем Вас, конкретно, не устраивает этот пример?

К сообщению приложен файл (tmp1.rar - 27Kb) cкачать
11 фев 19, 18:59    [21806809]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft Access Ответить