powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Распределение скидки по документам
16 сообщений из 16, страница 1 из 1
Распределение скидки по документам
    #39528058
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица документов реализации:
"Документ", "Клиент", "сумма документа" (С уникальным "документом")

Есть таблица:
"Клиент", "сумма скидки". (С уникальным "клиентом")
причем "сумма скидки" по клиенту всегда меньше чем SUM("сумма документа") по конкретному клиенту
Но "сумма скидки" по клиенту может превышать сумму по конкретному документу клиента.

Задача:
Сделать таблицу:
"Документ", "Клиент", "сумма документа", "сумма скидки"
(Т.Е. добавить столбец, или даже заполнить существующий там столбец т.е. не важно Update или Great)
в которой "сумма документа" в конкретном документе всегда больше чем "сумма скидки"

Т.Е. распределить скидку по имеющимся документам
не важно как, важно чтоб сумма скидки по документу не превышала бы сумму документа.

Пока на ум приходит только последовательный перебор.
Иду последовательно по таблице скидок, ищу документ этого клиента.
Если скидка <= суммы документа, то ставлю её в документ и перехожу к следующему клиенту (строке скидок)
Если нет, то ставлю в документ скидку равную сумме документа и ищу следующий документ/ы для разнесения остатка скидки.

должен быть способ/алгоритм легче.
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39528063
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183Т.Е. распределить скидку по имеющимся документам
не важно как, важно чтоб сумма скидки по документу не превышала бы сумму документа.
Пишешь скидку в первый попавшийся документ, если "не влезла", то остаток в следующий.
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39528072
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так и делаю.
Но это перебор через Scan/Replace.

Встал чисто теоритический вопрос решить эту задачу SQLem
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39528076
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда меняй структуру: добавь таблицу "скидка", туда пропиши Клиента и сумму, а в документах, которые к этой скидке относятся добавь ID скидки.

В таком случае одним update проставишь ID скидки на весь пакет документов.
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39528081
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТогда меняй структуру: добавь таблицу "скидка", туда пропиши Клиента и сумму, а в документах, которые к этой скидке относятся добавь ID скидки.
В таком случае одним update проставишь ID скидки на весь пакет документов.

Таблица "скидка" есть.
В ней "Клиент", "сумма скидки".
Клиент в ней выполняет роль ID.

И связь с документами осуществляется по "клиент".

А как через update не "проставить", а "распределить" - не знаю.
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39528092
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В SQL нет инструментов чтобы распределить сумму по строкам, т.е. средствами SQL твоя задача не решается.

Если скидка привязана к клиенту, то там она и должна оставаться, незачем ее размазывать по документам. В документе написать что-то типа "Ваша скидка на сегодня ... руб."

У тебя в целом решение так себе. Ты дезинформируешь клиента: возьмет он один из 3-х документов, там скидка 50% и он решит что ему дали скидку 50%. Если уж раскидывать, то пропорционально сумме документа, но тут все-равно на копейки может разойтись из-за округлений.
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39528093
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне не надо дезинформировать клиента, мне надо сформировать набор данных для хранилища в целях последующего анализа через сводные таблицы.
Это сильно упрощенная часть общей задачи.
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39528094
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модель:

Таблица "Документы": ClientID, Payment
Таблица "Скидка": ClientID, Discount

Запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT Документ.CliendID
     , Документ.Payment
     , Документ.Payment * СкидкаДоля.Percentage AS PaymentWithDiscount
FROM (  SELECT Документ.CliendID
             , 1 - IIf(IsNull(Скидка.Discount), 0, Скидка.Discount) / Sum(Документ.Payment) AS Percentage
        FROM Документ 
        LEFT JOIN Скидка ON Скидка.CliendID = Документ.CliendID
        GROUP BY Документ.CliendID, Скидка.Discount
     ) AS СкидкаДоля
INNER JOIN Документ ON СкидкаДоля.CliendID = Документ.CliendID;
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39528096
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS. Запрос построен в MS Access.
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39528101
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183Мне не надо дезинформировать клиента, мне надо сформировать набор данных для хранилища в целях последующего анализа через сводные таблицы.
Это сильно упрощенная часть общей задачи.
Ну и оставь "документ скидки" и не калечь документы реализации
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39528121
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaPS. Запрос построен в MS Access.
Спасибо. изучаю.
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39528128
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял.
Смысл - изменить алгоритм "распределения".
С "ФИФО" на "пропорциональное по всем документам".

Действительно. Тогда можно применить SQL процедуры.
Осталось только проверить ошибки округления.
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39528130
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли уж раскидывать, то пропорционально сумме документа, но тут все-равно на копейки может разойтись из-за округлений.
Ну да. Так и есть. Так и получилось.
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39529224
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, не работает "пропорциональное распределение"
Получается в каждом документе некая сумма, по которой в последствии генерят проводки.
А документов слишком много.

Видимо надо будет реализовать правило "распределять с наименьшим количеством "
Т.Е. перебор делать по индексу "клиент" + "сумма документа по убыванию".
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39529315
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183Видимо надо будет реализовать правило "распределять с наименьшим количеством "
Т.Е. перебор делать по индексу "клиент" + "сумма документа по убыванию".Если это нужно на уровне SQL-сервера, то процедура с курсором легко решит поставленную задачу.
...
Рейтинг: 0 / 0
Распределение скидки по документам
    #39529334
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял. Буду изучать.
А то надоело напильником всё это дорабатывать.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Распределение скидки по документам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]