比较两个表之间的值范围

Bad*_*mer 3 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        |
Run Code Online (Sandbox Code Playgroud)

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

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

Gor*_*off 10

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

select rebate_percentage, min_purchase,
       (lead(min_purchase, 1) over (order by min_purchase) - 1) as max_purchase
from rebates
Run Code Online (Sandbox Code Playgroud)

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

on totalorders between rebates.min_purchase and rebates.max_purchase
Run Code Online (Sandbox Code Playgroud)

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

on totalorders >= rebates.min_purchase and
    (totalorders <= rebates.max_purchase or rebates.max_purchase is null)
Run Code Online (Sandbox Code Playgroud)

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

  • 您可能必须添加逻辑来处理max_purchase的NULL值(不是100%确定最后一行返回的lead(),我假设为NULL) (3认同)
  • @Gordon:请更正你的解决方案:`或者rebates.max_purchase为null`而不是`totalorders is null`为你的解决方案+1 (2认同)