Задавайте вопросы, мы ответим
Вы не зашли.
Необходимо вывести наибольший платеж за тот день, когда сумма платежей была нибольшая.
Делаю по частям, чтобы потом сделать вложенные запросы.
1. Подсчитаем суммы за каждый день, указанный в таблице
Отредактированно jron (08.10.2017 18:19:57)
Неактивен
почему день не правильный см http://sqlinfo.ru/articles/info/18.html
Неактивен
Заменил оператор = на оператор IN , который работает если выводится несколько строк, но опять ошибка
Неактивен
потому, что вы одно значение paydate пытаетесь сравнить со строкой из двух значений (paydate, SUM(AMOUNT))
Неактивен
Но ведь по логике
Неактивен
В указанной мной статье приводится 5 способов решения, рекомендую.
По исходной задаче ещё нужно уточнить, что делать, если максимальная сумма платежей была в течении нескольких дней.
Неактивен
Рассуждения согласно статьи - 1-й способ
...как оказалось, есть правила синтаксиса языка SQL , которые не допускают выполнения запроса если в GROUP BY указано одно поле, по которому нужно группировать полученные данные, а в запросе SELECT - указывается больше полей по которым производится выборка.
Неактивен
Попробовал приспособить данный способ в моем случае
Неактивен
vasya написал:
По исходной задаче ещё нужно уточнить, что делать, если максимальная сумма платежей была в течении нескольких дней.
Этого не требуется так как полностью одинаковых таких записей я думаю в реальной практике будет - 1 на 1 000 000.
Хотя возможно.
таблицу учебную я сам составлял, а в условии только четко обозначено так
выводить наибольший платеж за тот день, когда сумма платежей была наибольшей
более сложный вариант от нас не требуется пока что.
Отредактированно jron (09.10.2017 16:43:40)
Неактивен
Кроме того я просмотрел способы, но дальше сложнее, а требуется решить задачу из имеющихся знаний
jron написал:
На данный момент по курсу знаю только
Select, from, where,in, group by, агрегатные функции и немного вложенные запросы
На работе Where внимание не заостряли и его использовал просто по примерам...
Неактивен
Первую часть задачи
1. Создайте запрос который будет
выводить сумму платежей за тот день, когда был сделан наибольший платеж
Я решил вот так
Неактивен
Вот это запрос должен был выделить из полученной таблицы вложенного запроса нужную мне дату, но
mysql> SELECT p.`paydate`, p.`amount` FROM payments p JOIN (SELECT `paydate`, SUM(`AMOUNT`) as `sum1` FROM payments GROUP BY `paydate`) as d
-> ON p.`paydate` = d.`paydate` and p.`amount` = max(d.`sum1`);
ERROR 1111 (HY000): Invalid use of group function
Отредактированно jron (09.10.2017 17:52:01)
Неактивен
То есть агрегатный запрос не может быть так использован?
А как тогда ?
Неактивен
jron написал:
vasya написал:
По исходной задаче ещё нужно уточнить, что делать, если максимальная сумма платежей была в течении нескольких дней.
Этого не требуется ...
тогда просто
jron написал:
Попробовал приспособить данный способ в моем случае
А что здесь не так?
сравните
Неактивен
jron написал:
А вот алгоритм решения задачи 1-м способом, как я его понимаю (правильно ли ?)
SELECT t.`user_id`, t.`post`, t.`time`
FROM `test_table` t JOIN
(SELECT `user_id`, max(`time`) as `mtime` FROM `test_table` GROUP BY `user_id`) as t1
ON t.`user_id`= t1.`user_id` AND t.`time` = t1.`mtime`;
подзапрос формирует временную таблицу t1, в которой содержатся данные полученные в ходе выполнения
SELECT `user_id`, max(`time`) as `mtime` FROM `test_table` GROUP BY `user_id`
JOIN это пересечение множеств (таблиц) `test_table` и t1 по условию ON t.`user_id`= t1.`user_id` AND t.`time` = t1.`mtime`
подробней см
http://sqlinfo.ru/forum/viewtopic.php?id=3210
Неактивен
vasya написал:
сравните
t.`user_id`= t1.`user_id` AND t.`time` = t1.`mtime`
иp.paydate = d.paydate and p.AMOUNT = (select max(d.sumAmount) from d) ;
илиp.`paydate` = d.`paydate` and p.`amount` = max(d.`sum1`);
Да здесь я неправ, нужно было указать псевдоним поля, которое будет формироваться во временной таблице d.
Я исправил, но в этом случае выдается непонятно что
Неактивен
Теперь учитывая что я правильно фильтрую нужные мне данные
Отредактированно jron (10.10.2017 16:26:33)
Неактивен
На всякий случай, может кому надо расшифровать
Неактивен
jron написал:
Я исправил, но в этом случае выдается непонятно что
это я невнимательно прочитал условие задачи
jron написал:
Вот этот запрос выводит только дату, когда была сделана наибольшая сумма платежей
SELECT d.`paydate`
FROM (SELECT paydate, SUM(AMOUNT) AS sumAmount FROM payments GROUP BY paydate order by 2 desc limit 1) as d
можно без подзапроса
jron написал:
p.s. А почему вы все имена полей заключаете в обратные кавычки `` ?
Ну понятно если это русское слово или слово с пробелом, но английские за чем ?
на случай ключевых слов, например, time в статье.
jron написал:
И еще, ксати заметил, что не нужно употреблять слово DISTINCT, mysql сам распознает если выводятся одинаковые строки и показывает одну.
Так например за этот день в таблице 3 таких платежа с одинаковой суммой 85000,
а можно mysql заставить чтобы он показал и стальные одинаковые строки, если таковые имеются ?
max(amount) делает неявную группировку, поэтому одна строка.
вот тут как раз и нужно использовать первый способ из статьи.
Неактивен
Не имеет смысла хранить в базе одинаковые строки.
Неактивен