2012-06-18 2 views
3

J'ai une base de données Oracle 10g dotée de deux tables: une table REBATES et une table ORDERS.Comparaison des plages de valeurs entre deux tables

La table RABAIS ressemble un peu comme ceci:

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

Je suis en train de déterminer le pourcentage de remise à appliquer, en fonction des commandes totales. Je sais comment trouver la somme de toutes les commandes pour un client particulier, pour un intervalle de temps particulier, mais comment puis-je également saisir le pourcentage de remise, le tout dans une requête?

Par exemple, si le total de la commande est de 16 000, comment puis-je construire une requête qui prend cette valeur, la compare à la table REBATES et renvoie la valeur 2.0?

Répondre

10

À mon avis, la façon la plus simple est que si vous avez un minimum et les montants d'achat max:

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

Ensuite, vous pouvez faire une simple entre rejoindre, où la condition de jointure ressemble:

on totalorders between rebates.min_purchase and rebates.max_purchase 

Vous pouvez gérer le dernier cas (avec NULLs) avec une condition de jointure modifiée:

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

Ou, alternati En changeant la logique d'origine pour avoir un coalesce() sur la fonction lead avec une très grande valeur.

+3

Vous pourriez avoir à ajouter une logique pour gérer les valeurs NULL pour max_purchase (non 100 % sûr que lead() renvoie pour la dernière ligne, je suppose que NULL) –

+0

@Gordon Linoff: Une chose de plus, si je fais une jointure à la table des commandes, alors seuls les enregistrements sont remplis dont la valeur est mise Si la valeur de la commande est inférieure à la plus basse, la remise doit être de 0. –

+2

@Gordon: S'il vous plaît corriger votre solution: 'ou rebates.max_purchase est null' pas' totalorders is null' +1 pour votre solution :) –

3

utilisation Fonctions:

Exemple:

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; 

Maintenant, vous pouvez appeler cette fonction dans votre requête

SELECT RebatePercentage(purchase_amt) from orders; 
Questions connexes