Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: MySQL, максимальное значение из нескольких полей?

Такая, казалось бы простая задача. Есть таблица, в ней 8 интересующих меня полей. Нужно написать запрос, который бы выбирал из каждой записи максимальное значение из этих восьми полей. Удивительно, но никакой подходящей функции не нашел, а делать с помощью CASE как-то уж очень громоздко.
Ответ:
Спасибо, то как раз то, что искал и сам найти не смог.
Вопрос: Как определить Max нескольких полей

День добрый уважаемые!
Не знаю как в Access определить максимальное значение нескольких полей.
За ранее благодарен.
Ответ: благодарствую за оказанную помощь, рад что я оказался не брошен на этом форуме
Вопрос: Вычет значений нескольких полей из значения поля другой таблицы.

У меня есть БД склада. В таблице "Детали" есть поле "На складе". Есть также таблица "Сборки", в которой все детали из той таблицы можно выбирать при помощи раскрывающегося списка. Мне нужно, чтобы, когда в таблице "Сборка" выбирались какие-то детали, "На складе" они вычитались. Я для этого сделала запрос на обновление, но проблема такова: если в таблице "Сборка" одна и та же деталь выбирается несколько раз, то из "На складе" вычитается только последнее значение. Как сделать, чтобы он суммировал значения одинаковых полей в таблице "Сборка" и вычитал их?

Раньше никогда не создавала никаких баз данных, поэтому особо мало что в этом понимаю.SQL не знаю, поэтому, если можно без него как-то это сделать, было бы замечательно.
Ответ: В форуме по аксесу была мегатема про сборку изделий.
Вопрос: Select по трем таблицам с ограничением вывода по максимальным значениям конкретного поля

Добрый день.

Пытаюсь решить, вероятно, простую задачу по выборке из трех связанных таблиц. Задача для меня не профильная, поэтому забуксовал, прошу помощи. Для упрощения переформулировал реальную задачу как можно более сократив объекты и поля.

Дано: MS Access 2010, три таблицы, один запрос.

Таблицы:
1) Объекты
2) Заявки
3) Наряды

Примитивно процесс, покрываемый этой структурой данных: для выполнения работы на Объекте(ах) открывается Заявка, для исполнения работ создается Наряд, связанный с Объектом, по которому выполняются работы запрошенные в некоторой Заявке.

Задача: построить запрос, показывающий все наряды, объекты им сопоставленные и заявку, предшевствовавшую каждому конкретному наряду на данном объекте.

Прямой связи Заявки и Наряды не имеют, связаны через один и тот же Объект. Ограничение, которое нельзя изменить добавив прямую связь.
Одна Завка - один или несколько Объектов (Allow Multiple Values = yes)
Один Наряд - один Объект, Несколько нарядов на один и тот же объект.

Запрос который не могу довести до ума:
SQL
1
2
3
4
SELECT Наряды.ID, Объект.Название, Наряды.[Дата открытия], Наряды.[Дата закрытия], Заявки.ID, Заявки.[Дата открытия]
FROM (Объект INNER JOIN Заявки ON Объект.Код = Заявки.Объект.VALUE) INNER JOIN Наряды ON Объект.Код = Наряды.Объект
GROUP BY Наряды.ID, Объект.Название, Наряды.[Дата открытия], Наряды.[Дата закрытия], Заявки.ID, Заявки.[Дата открытия]
HAVING (((Заявки.[Дата открытия])<[Наряды]![Дата открытия]) AND ((Заявки.Приоритет)=1));
Наряды, которым предшествует несколько заявок выводятся как несколько строк, по кол-ву найденных предшествующих заявок, что логично. Как ограничить вывод только одного сочетания, в котором дата Заявки максимальная, т.е. одна ближайшая предшествовашая Наряду заявка?
Ответ:
Сообщение от Gimli_r
Наряды, которым предшествует несколько заявок выводятся как несколько строк, по кол-ву найденных предшествующих заявок, что логично. Как ограничить вывод только одного сочетания, в котором дата Заявки максимальная, т.е. одна ближайшая предшествовашая Наряду заявка?
Если правильно понял (?)

Gimli_r, попробуйте запрос
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT obn.ID AS ОбъектID, obn.Название AS ОбъектНазвание, 
   obn.[Дата открытия] AS НарядДатаОткрытия, 
   obn.[Дата закрытия] AS НарядДатаЗакрытия, 
   obz.ID AS ЗаявкаID, obz.[Дата открытия] AS ЗаявкаДатаОткрытия
FROM
(SELECT Код, Наряды.ID, Объект.Название, Наряды.[Дата открытия], Наряды.[Дата закрытия]
  FROM Объект LEFT JOIN Наряды ON Объект.Код = Наряды.Объект) obn,
(SELECT Код, Название, Заявки.ID, Заявки.[Дата открытия]
  FROM Объект LEFT JOIN Заявки ON Объект.Код = Заявки.Объект.VALUE
  WHERE Заявки.Приоритет=1) obz,
obn INNER JOIN obz ON obn.Код = obz.Код
WHERE obn.[Дата открытия]>=(SELECT MAX([Дата открытия])
  FROM Объект LEFT JOIN Заявки ON Объект.Код = Заявки.Объект.VALUE
  WHERE Заявки.Приоритет=1 AND Объект.Код=obn.Код)
ORDER BY obz.ID, obn.ID
Вопрос: Определение максимального значения подзапроса

Имеется таблица
id (int) | title (varchar) | author (int) | filename (varchar) | views (int) |
Получите максимальное значение отношения "сумма просмотров фотографий одного автора / количество фотографий одного автора".
я создал такой запрос для получения значения "сумма просмотров фотографий одного автора / количество фотографий одного автора":
SQL
1
SELECT SUM(views) / COUNT(*) FROM gallery GROUP BY author
это выводит список этого выражения sum(views) / count(*)
А как теперь получить максимальное значение из этого результата?

Добавлено через 59 секунд
такое не работает
SQL
1
SELECT SUM(views) / COUNT(*) AS num FROM gallery GROUP BY author HAVING MAX(num)
Ответ:
Сообщение от phpk
Ваш код выдаёт результат 24.000
а этот код выдаёт 40.000
Не знаю, продебаж, выведи все значения
MySQL
1
2
3
 select  `avg` from (
  SELECT SUM(`views`) / COUNT(*) AS `avg` FROM `gallery` GROUP BY `author`
) as `t`
Добавлено через 3 минуты
Сообщение от phpk
и объясните пожалуйста, почему с приставкой ) as `t` такая конструкция работает, а без неё нет?
Потому, что такой синтаксис майскуэл
SELECT ... FROM (subquery) [AS] name ...

Выборка должа идти из таблицы. Если это выборка из выборки, то под-выборку надо поместить во временную таблицу, задав ей алиас
Вопрос: Запрос максимальное значение на определенный день

Всем доброго дня.
Имеется табличка apcvoltage со следующей структурой:

0|voltid|INTEGER|0||1
1|time_event|TIMESTAMP|0|CURRENT_TIMESTAMP|0
2|linev|REAL|0||0
3|loadpct|REAL|0||0
4|battv|REAL|0||0
5|bcharge|REAL|0||0

Мне нужно вывести максимальное значение по полю linev за определенный день. Как сделать правильный запрос?

Делаю так:
select time_event, linev from apcvoltage where linev = (select max(linev) from apcvoltage where time_event>'2014-08-22) and time_event>'2014-08-22'

Но мне кажется несколько раз фильтровать по time_event не есть верно.
Ответ: 13467826
Вопрос: Подсчитать Max нескольких полей

Доброго времени суток форумчане.
В процессе проектирования базы данных по производству плановых ремонтов возникла необходимость вычислить максимум из дат нескольких полей т.е. вычислить последний.
в MS Exel это делается легко, а как это можно реализовать в Access? неужели потребуется писать длинный if на сравнение значений между собою больше/меньше как в примере?
Если существует др способ нельзя ли выложить какой либо пример.
Заранее спасибо.
Ответ:
Сообщение от glsn
вычислить максимум из дат нескольких полей
Если именно полей одной записи то как в примере. Но тогда Ваша база скорей всего не нормализована, обычно ищут максимум одного поля в нескольких записях.
Вопрос: UPDATE на несколько полей сразу ???

ПРивет,

подскажите пожалуйста синтакс update на несколько полей

у меня такой вот update

update table set attr1,attr2=
(select attr_1, attr_2 from table2
where table2.oid=table.oid)

???

в чем ошибка?
Ответ:
Opla
Я же говорю, что благодаря вашему предложению с inner join я решила задачу.
Речь идет теперь просто о том, где была ошибка или невозможно с subselect несколько полей сразу изменить? если хотите, дело просто в принципе, как все-таки синтаксически правильно? нужно это или нет - другой вопрос!


еще раз, объясните, что для вас значит subselect? Это:

update 
  table 
set 
  attr1 = subselect.attr1,
  attr2 = subselect.attr2
from
  table
  INNER JOIN 
  (SELECT oid, attr1, attr2
   FROM Table2) AS subselect on
  table.oid=subselect.oid

???
Вопрос: Вывод максимального значения

Здравствуйте! Имеются три таблицы, связанные с собой внутренним идентификатором. Запрос возвращает в общей сложности, после связки всех трех таблиц - 10 полей. В этом результате есть одно числовое поле, по которому необходимо вытащить максимальное количество, НО, для каждого из значений другого поля. Если не совсем понятно объясни, то попытаюсь объяснить. Например, ежедневно продаются бананы и яблоки. Хочу посмотреть за месяц тот день, когда их было продано максимальное количество. Т.е. в итоге я должен увидеть две записи с максимальным количеством проданных яблок и бананов. Сложность тут в том, что это сейчас есть только два типа, по которым можно было бы составить условие выборки, но кроме этих бананов и яблок, может появится ещё набор различных товаров, поэтому критерий отбора по конкретному товару не будет, что и усложняет задачу для меня. Просьба помочь! Спасибо!
Ответ:
Сообщение от Евгений Стронг
Например, ежедневно продаются бананы и яблоки
при ежедневных продажах яблок и бананов заведем две таблицы
1) товары (goods)
[id - счетчик]
[dsc - описание товара]
2) продажи (sales)
[id - счетчик]
[dt - дата продажи]
[id_gds - ссылка на id в товарах]
[qty - количество проданного]

запрос может быть таким - синтаксис для MS Access:
Код SQL
1
2
3
4
5
6
7
8
SELECT s.id, s.dt, s.id_gds, s.qty, g.id, g.dsc
FROM (sales AS s INNER JOIN (
    SELECT id_gds, MAX(qty) AS maxqty
    FROM sales
    GROUP BY id_gds
  ) AS qmax ON (s.qty = qmax.maxqty) AND (s.id_gds = qmax.id_gds)
) INNER JOIN goods AS g ON s.id_gds = g.id
ORDER BY g.dsc

Не по теме:

в выборку войдут счетчики, и вероятно в окончательном варианте, они не будут нужны

Вопрос: Значение стобца на основе максимального значения в строке выборки.

Тему назвал как мог, сильно не пинайте. Объяснить задачу коротко не получается.
Есть таблицы:
users (id_user, tariff, всякие другие поля)
corporations (id_corp, corp, tariff, всякие другие поля)
corp_users (id, corp, user)
parties (id_party, party, tariff, всякие другие поля)
party_users (id, party, user)
tariffs (id_tariff, tariff, tariff_rights_user, всякие другие поля)

Тарифы задают права пользователя, права корпорации и права партии (три столбца, интересует только первый). Причём корпоративные тарифы и партийные тарифы могут повышать права пользователя. То есть для определения прав пользователя надо выбрать максимальное значение из трёх. Это у меня получилось сделать. Но теперь не пойму можно ли в этом же запросе или отдельно одним запросом, определить по какому тарифу назначены права? Ниже запрос по которому можно вывести таблицу пользователей с окончательными правами. Собственно в идеале вывести третий столбец tariff_name - которые будет равен t_user.tariff, t_corp.tariff или t_party.tariff в зависимости от того что выбрано GREATEST.

SELECT users.user, GREATEST(t_user.tariff_rights_user, t_corp.tariff_rights_user, t_party.tariff_rights_user) FROM users
inner join tariffs t_user on t_user.id_tariff=users.tariff
inner join corporation_users on corporation_users.user=users.id_user
inner join corporations on corporations.id_corp=corporation_users.corp
inner join tariffs t_corp on t_corp.id_tariff=corporations.corp_tariff
inner join party_users on party_users.user=users.id_user
inner join parties on party_users.party=parties.id_party
inner join tariffs t_party on t_party.id_tariff=parties.party_tariff

Это вообще реально сделать или проще не насиловать себе мозг и на PHP это сделать с несколькими запросами?
Ответ: javajdbc,

Партии и корпорации могут быть несколько, но там свои тонкости в этих случаях. конкретно в этот запрос партия или корпорация попадать будет только одна! ) Просто не хочу лишней информацией нагружать людей, мне и так очень сильно помогли, ибо о существовании CASE в селекте я даже не догадывался. ))
Логика то правильно срабатывает, но было подозрение, что можно упростить запрос. И как оказалось действительно можно. Вместо подзапросов вполне можно использовать имена столбцов в кейсах. Сразу пытался так сделать, но почему-то мускул на меня ругался, в итоге сделал подзапросы, но вчера попробовал ещё раз с именами столбцов и всё отлично сработало.
Спасибо всем!