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