【问题标题】:Comparing Value Ranges Between 2 Tables比较 2 个表之间的值范围
【发布时间】:2012-06-19 22:23:35
【问题描述】:

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

【问题讨论】:

    标签: sql oracle oracle10g


    【解决方案1】:

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

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

    然后你可以做一个简单的 between 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()。

    【讨论】:

    • 您可能必须添加逻辑来处理 max_purchase 的 NULL 值(不是 100% 确定最后一行的 Lead() 返回什么,我假设为 NULL)
    • @Gordon Linoff:还有一件事,如果我加入订单表,那么只有那些值在最小和最大购买范围之间的记录才会填充。如果订单价值低于最低最小购买那么它的回扣应该是0。
    • @Gordon:请纠正您的解决方案:or rebates.max_purchase is null 而不是totalorders is null +1 为您的解决方案:)
    • 谢谢瓜拉夫。我修好了。
    【解决方案2】:

    使用函数:

    例子:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多