3

我有一个 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?

4

2 回答 2

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

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

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

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

于 2012-06-18T18:13:56.217 回答
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;
于 2012-06-18T18:48:51.170 回答