Распределение скидки по документам
982183
Дата: 29.09.2017 08:10:27
Есть таблица документов реализации:
"Документ", "Клиент", "сумма документа" (С уникальным "документом")
Есть таблица:
"Клиент", "сумма скидки". (С уникальным "клиентом")
причем "сумма скидки" по клиенту всегда меньше чем SUM("сумма документа") по конкретному клиенту
Но "сумма скидки" по клиенту может превышать сумму по конкретному документу клиента.
Задача:
Сделать таблицу:
"Документ", "Клиент", "сумма документа", "сумма скидки"
(Т.Е. добавить столбец, или даже заполнить существующий там столбец т.е. не важно Update или Great)
в которой "сумма документа" в конкретном документе всегда больше чем "сумма скидки"
Т.Е. распределить скидку по имеющимся документам
не важно как, важно чтоб сумма скидки по документу не превышала бы сумму документа.
Пока на ум приходит только последовательный перебор.
Иду последовательно по таблице скидок, ищу документ этого клиента.
Если скидка <= суммы документа, то ставлю её в документ и перехожу к следующему клиенту (строке скидок)
Если нет, то ставлю в документ скидку равную сумме документа и ищу следующий документ/ы для разнесения остатка скидки.
должен быть способ/алгоритм легче.
Dima T
Дата: 29.09.2017 08:17:17
982183 |
---|
Т.Е. распределить скидку по имеющимся документам не важно как, важно чтоб сумма скидки по документу не превышала бы сумму документа. |
Пишешь скидку в первый попавшийся документ, если "не влезла", то остаток в следующий.
982183
Дата: 29.09.2017 08:30:47
Я так и делаю.
Но это перебор через Scan/Replace.
Встал чисто теоритический вопрос решить эту задачу SQLem
Dima T
Дата: 29.09.2017 08:38:27
Тогда меняй структуру: добавь таблицу "скидка", туда пропиши Клиента и сумму, а в документах, которые к этой скидке относятся добавь ID скидки.
В таком случае одним update проставишь ID скидки на весь пакет документов.
982183
Дата: 29.09.2017 08:46:13
Dima T |
---|
Тогда меняй структуру: добавь таблицу "скидка", туда пропиши Клиента и сумму, а в документах, которые к этой скидке относятся добавь ID скидки. В таком случае одним update проставишь ID скидки на весь пакет документов. |
Таблица "скидка" есть.
В ней "Клиент", "сумма скидки".
Клиент в ней выполняет роль ID.
И связь с документами осуществляется по "клиент".
А как через update не "проставить", а "распределить" - не знаю.
Dima T
Дата: 29.09.2017 09:09:09
В SQL нет инструментов чтобы распределить сумму по строкам, т.е. средствами SQL твоя задача не решается.
Если скидка привязана к клиенту, то там она и должна оставаться, незачем ее размазывать по документам. В документе написать что-то типа "Ваша скидка на сегодня ... руб."
У тебя в целом решение так себе. Ты дезинформируешь клиента: возьмет он один из 3-х документов, там скидка 50% и он решит что ему дали скидку 50%. Если уж раскидывать, то пропорционально сумме документа, но тут все-равно на копейки может разойтись из-за округлений.
982183
Дата: 29.09.2017 09:11:56
Мне не надо дезинформировать клиента, мне надо сформировать набор данных для хранилища в целях последующего анализа через сводные таблицы.
Это сильно упрощенная часть общей задачи.
Akina
Дата: 29.09.2017 09:14:36
Модель:
Таблица "Документы": ClientID, Payment
Таблица "Скидка": ClientID, Discount
Запрос:
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;
Akina
Дата: 29.09.2017 09:16:12
PS. Запрос построен в MS Access.
Изопропил
Дата: 29.09.2017 09:31:11
982183 |
---|
Мне не надо дезинформировать клиента, мне надо сформировать набор данных для хранилища в целях последующего анализа через сводные таблицы. Это сильно упрощенная часть общей задачи. |
Ну и оставь "документ скидки" и не калечь документы реализации