SQL Dojo Beta
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_noroundedfee_share
10.330.34
20.330.33
30.330.33
In Randori ausprobieren