比较两个表之间的值范围

时间:2012-06-18 18:07:33

标签: sql oracle oracle10g

我有一个oracle 10g数据库,它有2个表:REBATES表和ORDERS表。

REBATES表看起来像这样:

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

我正在尝试根据总订单确定要应用的回扣百分比。我知道如何在特定时间范围内找到特定客户的所有订单总和,但我如何在一个查询中获取折扣百分比?

例如,如果订单总数为16,000,那么我该如何构造一个获取该值的查询,将其与REBATES表进行比较,然后返回2.0?

2 个答案:

答案 0 :(得分:10)

在我看来,最简单的方法是如果您有最小和最大购买金额:

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

然后你可以在join之间做一个简单的连接条件:

on totalorders between rebates.min_purchase and rebates.max_purchase

您可以使用修改的连接条件处理最终情况(使用NULL):

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

或者,或者,通过更改原始逻辑以使引导函数上的coalesce()具有一些非常大的值。

答案 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;