Задать вопрос
kodnik
@kodnik

Возможно в запросе организовать подбор, чтобы суммарно не превышало заданное число?

Есть таблица с контрагентами и возникшей перед ними задолженностью со временем возникновения её.
| contr (контрагент) | time (дата) | val (сумма) |

Нужно получить список задолженностей на сумму, которая не больше определенной суммы готовую оплатить за раз(max_cash). А так-же количество уникальных контрагентов не должно быть больше 100 фирм и чисто по одному контрагенту проводить оплату за раз - тоже нельзя, т.к. нужно закрывать по дате (FIFO).

Как можно в запросе организовать подбор, что бы суммарно не превышало число max_cash?
  • Вопрос задан
  • 55 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 4
@barolina
turn coffee into code
SELECT model, COUNT(model) AS Qty_model, 
       AVG(price) AS Avg_price
    FROM PC
    GROUP BY model
    HAVING AVG(price) < 800;


www.sql-tutorial.ru/ru/book_having_clause.html
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Просто делаете запрос всех записей с сортировкой по дате задолженности и выбираете по одной, пока не достигнете лимита.
Ответ написан
Комментировать
tsklab
@tsklab
Здесь отвечаю на вопросы.
SELECT * FROM (
  SELECT contr, [time], SUM(val) OVER ( ORDER BY [time] ) AS sumcash
    FROM something ) AS cash
  WHERE sumcash <= max_cash

SELECT — предложение OVER.
Ответ написан
Комментировать
LaRN
@LaRN
Senior Developer
Можно вот так попробовать:
select d1.[time], d1.contr, d1.val
  from debt d1
  join debt d2
    on d2.[time] <= d1.[time]
 group by d1.contr, d1.val, d1.[time]
having sum(d2.val) <= 25 -- сумма которую нужно выплатить
 order by d1.[time]


Тут debt - таблица с задолженностями.
Есть пара моментов при такой реализации:
1. Нужно быть уверенным, что все задолженности будут попадать в систему с разными датами-временем,
если например дата и время совпадут у двух, то как тут строить ФИФО вопрос.
2. Желательно как-то помечать задолженности которые оплачены, чтобы повторно их не отбирать.
3. Поле time лучше обозвать иначе, сейчас оно совпадает с системным типом данных для хранения времени.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы