我正在研究一個 oracle PL/SQL 行程,該行程將單個貨幣金額分配給特定組中的多個相關方。假設“pGroupRef”是一個輸入引數,當前的實作首先指定一個“主要”參與方,然后按如下方式在所有次要參與方之間分配數量:
INSERT INTO ActualValue
SELECT
...
pGroupRef AS GroupRef,
ROUND(Am.Amount * P.SplitPercentage / 100, 2) AS Amount,
...
FROM
Amount Am,
Party P
WHERE
Am.GroupRef = pGroupRef
AND P.GroupRef = Am.GroupRef
...
P.PrimaryInd = 0;
最后,它運行第二個程式來插入任何剩余的金額給主要方,即:
INSERT INTO ActualValue
SELECT
...
pGroupRef AS GroupRef,
Am.Amount - S.SecondaryAmounts,
FROM
Amount Am,
Party P,
(SELECT SUM(Amount) AS SecondaryAmounts FROM ActualValue WHERE GroupRef = pGroupRef) S
WHERE
Am.GroupRef = pGroupRef
AND P.GroupRef = Am.GroupRef
...
P.PrimaryInd = 1;
然而,這里的完整查詢非常大,我通過添加子組使這個區域變得更加復雜,每個子組都有自己的主要成員,以及覆寫的可能性 - 因此,如果我繼續使用這個實作,那么這將意味著大量重復的 SQL。
我想我總是可以在運行單個統一插入之前將正確的數量計算到陣列中 - 但我覺得必須有一種優雅的數學方法來在單個 SQL 查詢中捕獲此邏輯。
uj5u.com熱心網友回復:
因此,您可以使用分析函式來獲取所需內容。由于我不知道你的確切結構,這只是一個例子:
SELECT s.party_id, s.member_id,
s.portion DECODE(s.prime, 1, s.total - SUM(s.portion) OVER (PARTITION BY s.party_id),0)
FROM (SELECT p.party_id, p.member_id,
ROUND(a.amt*(p.split/100), 2) AS PORTION,
a.amt AS TOTAL, p.prime
FROM party p
INNER JOIN amount a ON p.party_id = a.party_id) s
因此,在查詢中,您有一個收集所需資訊的子查詢,然后外部查詢將所有內容放在一起,僅將余數應用于標記為素數的記錄。
這是一個 DBFiddle,展示了它是如何作業的(鏈接)
注意:有趣的是,在 DBFiddle 的示例中,多付了 0.01,因此主要支付的實際上更少。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316311.html
上一篇:基于連續資料的行編號?
