2012-06-18 48 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;