Вы можете использовать очень простую структуру для хранения затрат:
DECLARE @costs TABLE (
ID INT,
Perc DECIMAL(18, 6),
Flat DECIMAL(18, 6)
);
Столбец Perc
представляет процент от базовой цены.В этой структуре можно хранить сложные вычисления , но она становится некрасивой .Например, если у нас есть:
- Базовая цена: 100
- Фиксированная плата: 20
- Налог: 11,5%
- Плата за обработку: 3%
Тогда он будет храниться как:
INSERT INTO @costs VALUES
-- op example
(1, 0.0, NULL),
(1, 0.3, NULL),
(1, NULL, 33.0),
(1, NULL, 155.0),
-- above example
(2, 0.0, NULL),
(2, NULL, 20.0),
(2, 0.115, NULL),
(2, NULL, 20.0 * 0.115),
(2, 0.03, NULL),
(2, NULL, 20.0 * 0.03),
(2, 0.115 * 0.03, NULL),
(2, NULL, 20 * 0.115 * 0.03);
И будет запрашиваться как:
DECLARE @tests TABLE (
ID INT,
BasePrice DECIMAL(18, 2)
);
INSERT INTO @tests VALUES
(1, 36.0),
(2, 100.0);
SELECT t.ID, SUM(
BasePrice * COALESCE(Perc, 0) +
COALESCE(Flat, 0)
) AS TotalPrice
FROM @tests t
INNER JOIN @costs c ON t.ID = c.ID
GROUP BY t.ID
ID | TotalPrice
---+-------------
1 | 234.80000000
2 | 137.81400000
Другое, лучшее решение - использоватьструктура выглядит следующим образом:
DECLARE @costs TABLE (
ID INT,
CalcOrder INT,
PercOfBase DECIMAL(18, 6),
PercOfPrev DECIMAL(18, 6),
FlatAmount DECIMAL(18, 6)
);
Где CalcOrder
представляет порядок, в котором выполняется расчет (например, налог до сбора за обработку).PercOfBase
и PercOfPrev
указывают, умножается ли базовая цена или текущая сумма.Это позволяет вам обрабатывать ситуации, когда, например, комиссия добавляется к базовой цене, но она не должна включаться в налог и наоборот.Этот подход требует рекурсивного или итеративного запроса.