Muster
Aufteilung mit Rest
Einen Betrag nach Gewichten auf Zeilen verteilen, auf den Cent gerundet, mit dem Rest auf einer gewählten Zeile, damit die Teile genau aufgehen.
Anteil = ROUND(amount × weight / SUM(weight) OVER (PARTITION BY parent), 2). Das Runden jedes Anteils verliert oder
gewinnt einen Cent: Geben Sie amount − SUM(share) OVER (PARTITION BY parent) einer Zeile, die nach einer festen Regel
gewählt wird (die größte, dann die kleinste ID). Testen Sie es: Pro Elternzeile ergeben die Anteile zusammen den Betrag.
Verwendet für Gebühren, Versand, Bestellrabatte, Budgets.
WITH lines(line_no, amount) AS (VALUES (1, 10.00), (2, 10.00), (3, 10.00)),
shares AS (
SELECT line_no, amount,
CAST(ROUND(1.00 * amount / SUM(amount) OVER (), 2) AS DECIMAL(10,2)) AS rounded,
ROW_NUMBER() OVER (ORDER BY amount DESC, line_no) AS rank_in_order
FROM lines
)
SELECT line_no, rounded,
rounded + CASE WHEN rank_in_order = 1 THEN 1.00 - SUM(rounded) OVER () ELSE 0 END AS fee_share
FROM shares
ORDER BY line_no;
| line_no | rounded | fee_share |
|---|---|---|
| 1 | 0.33 | 0.34 |
| 2 | 0.33 | 0.33 |
| 3 | 0.33 | 0.33 |