Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.11.2015, 17:46
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию Запрос с подстановкой строки по условию

Есть таблица платёжек:

Код:
№Счёта	№Платёжки	Сумма	   Дата
1	       1	     14	     12.10.2014
1	       2	     21	     13.10.2014
1	       3	     11	     14.10.2014
2	       4	     18	     15.10.2014
2	       5	     4	     21.10.2014
мне нужно сгруппировать эту таблицу по №Счета так, чтоб рядом с этим номером оказался № платёжки с Максимальной Суммой и все остальные параметры (№ Платёжки, дата) соответствующие этой сумме

Код:
№Счёта	№Платёжки	Сумма	Дата
1	       2	     21	     13.10.2014
2	       4	     18	     15.10.2014

Используется MySQL

Запрос типа
Код:
SELECT 
  ContractID, -- (№Счёта)
  BillingID, -- (№ Платёжки)
  MAX(Summ), -- (Сумма)
  BillingDate  -- (Дата)
FROM
  BIlls 
GROUP BY ContractID

провалился. В поля BillingDate и BillingID подставляются наименьшие "по порядку" значения (т.е. первые из списка)

Ломаю голову над вложенными запросами, но что-то ничего толкового в голову не пришло.
Ответить с цитированием
  #2  
Старый 11.11.2015, 19:15
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,036
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Посмотри, твоя версия MySQL поддерживает оконные функции?
Если да, то можно попробовать что-то типа:
Код:
select acc_no, 
       last_value(doc_no) over (partition by acc_no order by summ asc) as doc_id,
       last_value(summ) over (partition by acc_no order by summ asc) as summ_id,
       last_value(doc_dt) over (partition by acc_no order by summ asc) as doc_dt_id
from demo
group by acc_no
Ответить с цитированием
  #3  
Старый 11.11.2015, 19:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,036
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вот запрос без оконных функций, но он может вернуть больше чем 1 строку для счета, если для какого-то счета будет 2 одинаковые максимальные суммы:
Код:
select acc_no, doc_no, summ, doc_dt
from demo d
where summ = (select MAX(summ) from demo dd where d.acc_no = dd.acc_no)
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Uniq! (19.11.2015)
  #4  
Старый 13.11.2015, 10:43
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от lmikle
Вот запрос без оконных функций, но он может вернуть больше чем 1 строку для счета, если для какого-то счета будет 2 одинаковые максимальные суммы:
Код:
select acc_no, doc_no, summ, doc_dt
from demo d
where summ = (select MAX(summ) from demo dd where d.acc_no = dd.acc_no)

Во внутреннем запросе пропущена группировка по doc_no.

Спасибо, я разобрался. Такая простая задача, и такое угрюмое решение.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter