Похоже, что вы делаете какое-то "распределение" здесь.Это обычная проблема всякий раз, когда вы пытаетесь распределить что-то от более высокой гранулярности к более низкой гранулярности, и вам нужно иметь возможность правильно повторно агрегировать в общее значение.
Это становится гораздо большей проблемойпри работе с большими дробями.
Например, если я попытаюсь разделить общую стоимость, скажем, 55,30 доллара на восемь, я получу десятичное значение в 6,9125 доллара для каждого из восьми сегментов.Должен ли я округлить один до $ 6,92, а остальные до $ 6,91?Если я это сделаю, я потеряю ни цента.Мне нужно было бы округлить один до 6,93 доллара, а остальные до 6,91 доллара.Это ухудшается, когда вы добавляете больше ведер для деления на.
Кроме того, когда вы начинаете округление, вы вводите проблемы типа «Должно ли 33,339 быть округлено до 33,34 или 33,33?»
Если ваша бизнес-логика такова, что вы просто хотите взять остатоккроме двух значащих цифр может существовать и добавлять его к одному из значений в долларах «случайным образом», чтобы вы не потеряли ни цента, @Diego находится на правильном пути.
Выполнение этого в чистом SQL являетсянемного сложнее.Начнем с того, что ваш процент не 1/3, а 0,33, что даст общее значение 9,9, а не 10. Я бы сохранил это как отношение или как десятичное поле высокой точности (.33333333333333).
P S PCT Total
-- -- ------------ ------
P1 S1 .33333333333 10.00
P2 S2 .33333333333 10.00
P3 S3 .33333333333 10.00
SELECT
BaseTable.P, BaseTable.S,
CASE WHEN BaseTable.S = TotalTable.MinS
THEN BaseTable.BaseAllocatedValue + TotalTable.Remainder
ELSE BaseTable.BaseAllocatedValue
END As AllocatedValue
FROM
(SELECT
P, S, FLOOR((PCT * Total * 100)) / 100 as BaseAllocatedValue,
FROM dataTable) BaseTable
INNER JOIN
(SELECT
P, MIN(S) AS MinS,
SUM((PCT * Total) - FLOOR((PCT * Total * 100)) / 100) as Remainder,
FROM dataTable
GROUP BY P) as TotalTable
ON (BaseTable.P = TotalTable.P)
Похоже, что ваш расчет является равным распределением, основанным на общем количестве продуктов на одного поставщика.Если это так, может быть выгодно удалить процент и вместо этого просто сохранить количество элементов на одного поставщика в таблице.
Если также возможно сохранить флаг, указывающий строку, которая должна получить значение остаткаПрименительно к нему, вы можете назначить на основе этого флага, а не случайно.