2012-06-18 51 views
3

我有一個Oracle 10g數據庫有兩個表:一個REBATES表和一個ORDERS表。比較兩個表之間的值範圍

回扣表看起來有點像這樣:

| rebate_percentage | min_purchase | 
------------------------------------ 
| 1.0    | 5000   | 
| 1.5    | 7000   | 
| 2.0    | 11000  | 
| 5.0    | 20000  | 

我試圖確定的回扣比例應用,基於總訂單。我知道如何在特定時間範圍內找到特定客戶的所有訂單的總和,但我怎樣才能在一個查詢中獲得回扣百分比?

例如,如果訂單總數爲16,000,那麼我如何構建一個接受此值的查詢,將它與REBATES表進行比較,並返回2.0?

回答

10

在我看來,最簡單的方法是,如果你有一個最大和最小購買金額:

select rebate_percentage, min_purchase, 
     (lead(min_purchase, 1) over (order by min_purchase) - 1) as max_purchase 
from rebates 

然後,你可以做加盟之間的簡單,這裏的連接條件是這樣的:

on totalorders between rebates.min_purchase and rebates.max_purchase 

on totalorders >= rebates.min_purchase and 
    (totalorders <= rebates.max_purchase or rebates.max_purchase is null) 

或者alternati:

您可以修改連接條件處理的最後一種情況(如果爲空)通過改變原來的邏輯,使lead函數上的coalesce()具有一些非常大的值。

+3

您可能需要添加邏輯來處理max_purchase NULL值(不是100 %肯定鉛()返回最後一行,我假設NULL) –

+0

@戈登Linoff:還有一件事,如果我加入訂單表,那麼只有那些記錄填充誰的價值下注在最小和最大購買範圍內。如果訂單價值低於最低購買價格,那麼其回扣應爲0。 –

+2

@戈登:請更正您的解決方案:'或rebates.max_purchase爲空'不是'totalorders爲空'+1爲您的解決方案:) –

3

使用的功能:

例子:

FUNCTION RebatePercentage(purchase Number) RETURN NUMBER IS 
    rebateVal NUMBER; 
    minPurchase NUMBER; 
BEGIN 

    SELECT MAX(min_purchase) 
    INTO minPurchase 
    FROM REBATES 
    WHERE min_purchase <= purchase; 

    SELECT rebate_percentage 
    INTO rebateVal 
    FROM REBATES WHERE min_purchase = minPurchase; 

    RETURN (rebateVal); 
END; 

現在你可以調用這個函數在查詢

SELECT RebatePercentage(purchase_amt) from orders;