2010-01-26 5 views
1

J'ai écrit une requête pour Sélectionner des valeurs de ventes à partir d'une base de données et appliquer des remises si elles étaient utilisées. Les réductions sont soit un pourcentage ou simplement une valeur forfaitaire. Ma requête applique les remises (déclaration du premier cas), puis extrait le montant appliqué.Combinaison de deux résultats logiques conditionnels dans une instruction case

Il m'a fait penser si c'était possible d'obtenir ceci dans une déclaration de cas.

Requête:

SELECT 
SUM(CASE 
WHEN td.Transaction_ID IS NULL 
    THEN p.Sale 
WHEN td.Transaction_ID IS NOT NULL AND d.Discount_Type = '0' 
    THEN p.Sale - (p.Sale * (dp.Discount_Percent/100)) 
ELSE 
    p.Sale - dv.Discount_Value 
END) PriceDiscounted, 
SUM(CASE 
WHEN td.Transaction_ID IS NOT NULL AND d.Discount_Type = '0' 
    THEN (p.Sale * (dp.Discount_Percent/100)) 
WHEN td.Transaction_ID IS NOT NULL AND d.Discount_Type = '1' 
    THEN dv.Discount_Value 
ELSE '0' 
END) Discount 
+0

Désolé - Je n'ai pas remarqué le mysql dans votre question: ma réponse était spécifique à ms-sql. – davek

Répondre

1

Pas une instruction CASE dans un SELECT est une fonction et ne peut retourner une valeur. Vous pouvez implémenter ceci dans une procédure stockée dans laquelle vous pouvez utiliser CASE ou IF THEN.

+0

est-ce que cela s'applique à toutes les instructions conditionnelles dans MySQL? –

+0

Oui, les instructions CASE dans un SELECT n'autorisent qu'une valeur pour THEN ou ELSE, tandis que l'instruction CASE dans une procédure stockée (ou une fonction stockée) peut contenir n'importe quelle expression. – MindStalker

+0

Je devrais ajouter qu'un CAS de procédure stockée ne peut pas parcourir les multiples enregistrements d'une table comme un SELECT normal, vous devez utiliser un curseur. Ainsi, les avantages de performance seraient perdus. – MindStalker

Questions connexes