Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Распределение скидки по документам / 16 сообщений из 16, страница 1 из 1
29.09.2017, 08:10
    #39528058
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределение скидки по документам
Есть таблица документов реализации:
"Документ", "Клиент", "сумма документа" (С уникальным "документом")

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

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

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

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

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

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

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

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

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

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

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

У тебя в целом решение так себе. Ты дезинформируешь клиента: возьмет он один из 3-х документов, там скидка 50% и он решит что ему дали скидку 50%. Если уж раскидывать, то пропорционально сумме документа, но тут все-равно на копейки может разойтись из-за округлений.
...
Рейтинг: 0 / 0
29.09.2017, 09:11
    #39528093
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределение скидки по документам
Мне не надо дезинформировать клиента, мне надо сформировать набор данных для хранилища в целях последующего анализа через сводные таблицы.
Это сильно упрощенная часть общей задачи.
...
Рейтинг: 0 / 0
29.09.2017, 09:14
    #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
29.09.2017, 09:16
    #39528096
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределение скидки по документам
PS. Запрос построен в MS Access.
...
Рейтинг: 0 / 0
29.09.2017, 09:31
    #39528101
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределение скидки по документам
982183Мне не надо дезинформировать клиента, мне надо сформировать набор данных для хранилища в целях последующего анализа через сводные таблицы.
Это сильно упрощенная часть общей задачи.
Ну и оставь "документ скидки" и не калечь документы реализации
...
Рейтинг: 0 / 0
29.09.2017, 09:59
    #39528121
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределение скидки по документам
AkinaPS. Запрос построен в MS Access.
Спасибо. изучаю.
...
Рейтинг: 0 / 0
29.09.2017, 10:14
    #39528128
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределение скидки по документам
Я понял.
Смысл - изменить алгоритм "распределения".
С "ФИФО" на "пропорциональное по всем документам".

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

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


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