3

REBATES テーブルと ORDERS テーブルの 2 つのテーブルを持つ Oracle 10g データベースがあります。

REBATES テーブルは次のようになります。

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

注文合計に基づいて、適用するリベートのパーセンテージを決定しようとしています。特定の顧客の特定の時間範囲のすべての注文の合計を見つける方法は知っていますが、1 つのクエリでリベートのパーセンテージも取得するにはどうすればよいですか?

たとえば、注文合計が 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

次に、結合条件が次のようになる単純な between 結合を実行できます。

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 に答える