IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Requete IF ELSE multiple


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 27
    Par défaut Requete IF ELSE multiple
    Bonjour,


    Je cherche à mettre à jour une valeur de ma base coef_vente en fonction de la valeur d'une autre dpx_art dans la table article.

    J'ai essaye de faire cela comme requête mais cela ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    if (article.dpx_art <= 0.5)
    BEGIN
    	UPDATE article
    	SET coef_vente = 10
    END
     
    Else 
    if ( article.dpx_art > 0.5 AND article.dpx_art <= 5)
    BEGIN
    	UPDATE article
    	SET coef_vente = -0.6666*{article.dpx_art}+10.33
    END
     
    Else 
    if ( article.dpx_art > 5 AND article.dpx_art <= 13)
    BEGIN
    	UPDATE article
    	SET coef_vente = -0.375*{article.dpx_art}+8.875
    END
     
     
     
    //Else if {article.dpx_art} > 13 AND {article.dpx_art} <= 23 then -0.06*{article.dpx_art}+4.78
    //Else if {article.dpx_art} > 23 AND {article.dpx_art} <= 61 then -0.01052632*{article.dpx_art}+3.642105263
    //Else if {article.dpx_art} > 61 AND {article.dpx_art} <= 107 then -0.00652174*{article.dpx_art}+3.397826087
    //Else if {article.dpx_art} > 107 AND {article.dpx_art} <= 153 then -0.01086957*{article.dpx_art}+3.863043478
    //Else if {article.dpx_art} > 153 AND {article.dpx_art} <= 305 then -0.00197368*{article.dpx_art}+2.501973684
    //Else if {article.dpx_art} > 305 AND {article.dpx_art} <= 763 then -0.00021834*{article.dpx_art}+1.96659839
    //Else if {article.dpx_art} > 763 then 1.6
    Avez-vous une solution?

    Merci d'avance

    Cordialement,

    Olivier

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par k-lendos Voir le message
    mais cela ne fonctionne pas.
    Qu'est-ce que vous entendez par là ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 27
    Par défaut
    Il me retourne un problème de syntaxe mais c'était du aux {} (dont je ne me rappelle plus le nom) .

    Par contre j'ai contourné le problème en faisant cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    UPDATE article
    SET coef_vente = 10
    from article Where dpx_art >= 0 AND dpx_art <= 0.5 AND (typ_art = 'S' OR typ_art = 'A') AND dat_dpx > 01/01/2009 ;
     
     
     
    UPDATE article
    SET coef_vente = -0.6666*dpx_art+10.33
    from article Where dpx_art > 0.5 AND dpx_art <= 5 AND (typ_art = 'S' OR typ_art = 'A') AND dat_dpx > 01/01/2009;
     
     
    UPDATE article
    SET coef_vente = -0.375*dpx_art+8.875
    from article Where dpx_art > 5 AND dpx_art <= 13 AND (typ_art = 'S' OR typ_art = 'A') AND dat_dpx > 01/01/2009;
     
     
    UPDATE article
    SET coef_vente = -0.06*dpx_art+4.78
    from article Where dpx_art > 13 AND dpx_art <= 23 AND (typ_art = 'S' OR typ_art = 'A') AND dat_dpx > 01/01/2009;
     
     
    UPDATE article
    SET coef_vente =  -0.01052632*dpx_art+3.642105263
    from article Where dpx_art > 23 AND dpx_art <= 61 AND (typ_art = 'S' OR typ_art = 'A') AND dat_dpx > 01/01/2009;
     
     
    UPDATE article
    SET coef_vente =  -0.00652174*dpx_art+3.397826087
    from article Where dpx_art > 61 AND dpx_art <= 107 AND (typ_art = 'S' OR typ_art = 'A') AND dat_dpx > 01/01/2009;
     
     
    UPDATE article
    SET coef_vente =  -0.01086957*dpx_art+3.863043478
    from article Where dpx_art > 107 AND dpx_art <= 153 AND (typ_art = 'S' OR typ_art = 'A') AND dat_dpx > 01/01/2009;
     
     
    UPDATE article
    SET coef_vente =  -0.00197368*dpx_art+2.501973684
    from article Where dpx_art > 153 AND dpx_art <= 305 AND (typ_art = 'S' OR typ_art = 'A') AND dat_dpx > 01/01/2009;
     
     
    UPDATE article
    SET coef_vente =  -0.00021834*dpx_art+1.96659839
    from article Where dpx_art > 305 AND dpx_art <= 763 AND (typ_art = 'S' OR typ_art = 'A') AND dat_dpx > 01/01/2009;
     
     
    UPDATE article
    SET coef_vente =  1.6
    from article Where dpx_art > 763 AND (typ_art = 'S' OR typ_art = 'A') AND dat_dpx > 01/01/2009;
    Est-ce que vous avez plus propre?

    Merci encore

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par k-lendos Voir le message
    Il me retourne un problème de syntaxe mais c'était du aux {} (dont je ne me rappelle plus le nom).
    Merci de la précision de vos informations. Ça aide, c'est sûr...

    Pour vos requêtes, vous pouvez faire ça en une avec des case.

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Utilisons case :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    UPDATE	dbo.article
    SET	coef_vente = CASE
    			WHEN dpx_art <= 0.5 THEN 10
    			WHEN dpx_art > 0.5 AND dpx_art <= 5 THEN -0.6666 * dpx_art + 10.33
    			WHEN dpx_art > 5 AND dpx_art <= 13 THEN -0.375 * dpx_art + 8.875
    			WHEN dpx_art > 13 AND dpx_art <= 23 THEN -0.06 * dpx_art + 4.78
    			WHEN dpx_art > 23 AND dpx_art <= 61 THEN -0.01052632 * dpx_art + 3.642105263
    			WHEN dpx_art > 61 AND dpx_art <= 107 THEN -0.00652174 * dpx_art + 3.397826087
    			WHEN dpx_art > 107 AND dpx_art <= 153 THEN -0.01086957 * dpx_art + 3.863043478
    			WHEN dpx_art > 153 AND dpx_art <= 305 THEN -0.00197368 * dpx_art + 2.501973684
    			WHEN dpx_art > 305 AND dpx_art <= 763 THEN -0.00021834 * dpx_art + 1.96659839
    			ELSE 1.6
    		END
    @++

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 27
    Par défaut
    Parfait merci beaucoup c'est exactement ce que je cherchais!!

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Cependant c'est loin d'être souple.
    Vous pouvez par exemple remplacer l'actuelle colonne coef_vente par une colonne calculée.
    Vous pourriez pour cela créer une table comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE coef_vente_palier
    (
    	id_coef_vente_palier INT NOT NULL IDENTITY CONSTRAINT PK_coef_vente_palier PRIMARY KEY
    	, borne_inferieure decimal
    	, borne_superieure decimal
    	, coef decimal NOT NULL
    	, ponderateur decimal NOT NULL
    )
    Pour y stocker les valeurs caractéristiques de vos paliers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO coef_vente_palier (borne_inferieure, borne_superieure, coef, ponderateur) VALUES (-100000000000000, 0.5, 10, 0)
    INSERT INTO coef_vente_palier (borne_inferieure, borne_superieure, coef, ponderateur) VALUES (0.5, 5, -0.6666 , 10.33)
    INSERT INTO coef_vente_palier (borne_inferieure, borne_superieure, coef, ponderateur) VALUES (5, 13, -0.375 , 8.875)
    INSERT INTO coef_vente_palier (borne_inferieure, borne_superieure, coef, ponderateur) VALUES (13, 23, -0.06 , 4.78)
    INSERT INTO coef_vente_palier (borne_inferieure, borne_superieure, coef, ponderateur) VALUES (23, 61, -0.01052632 , 3.642105263)
    INSERT INTO coef_vente_palier (borne_inferieure, borne_superieure, coef, ponderateur) VALUES (61, 107, -0.00652174 , 3.397826087)
    INSERT INTO coef_vente_palier (borne_inferieure, borne_superieure, coef, ponderateur) VALUES (107, 153, -0.01086957 , 3.863043478)
    INSERT INTO coef_vente_palier (borne_inferieure, borne_superieure, coef, ponderateur) VALUES (153, 305, -0.00197368 , 2.501973684)
    INSERT INTO coef_vente_palier (borne_inferieure, borne_superieure, coef, ponderateur) VALUES (305, 763, -0.00021834 , 1.96659839)
    INSERT INTO coef_vente_palier (borne_inferieure, borne_superieure, coef, ponderateur) VALUES (763, 100000000000000, 1.6, 0)
    Puis la fonction qui vous servira à spécifier la colonne calculée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE FUNCTION Fn_get_coef_vente (@_dpx_art DECIMAL)
    	RETURNS DECIMAL(20,10)
    WITH SCHEMABINDING
    AS
    BEGIN
    	RETURN
    	(
    		SELECT	coef * @_dpx_art + ponderateur
    		FROM	dbo.coef_vente_palier
    		WHERE	@_dpx_art > borne_inferieure
    		AND	@_dpx_art <= borne_superieure
    	)
    END
    Pour ajouter la colonne à la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE dbo.article
    ADD coef_vente AS (dbo.Fn_get_coef_vente(dpx_art))
    Vous pouvez éventuellement indexer cette colonne pour pouvoir filtrer efficacement votre table suivant celle-ci.

    En cas de changement ou d'ajout d'un palier, il vous suffit de modifier la table, donc pas de changement de votre code.

    @++

Discussions similaires

  1. Requetes sur tables multiples ! Pour les 'gurus'
    Par bandicoq dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/08/2008, 11h39
  2. optimisation d'une requete de jointure multiple
    Par M_Dandouna dans le forum SQL
    Réponses: 17
    Dernier message: 02/01/2008, 21h54
  3. Requete sur tri multiple
    Par Guillaume C dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/11/2007, 11h59
  4. TableAdapter requete avec parametre multiple.
    Par isambert dans le forum Accès aux données
    Réponses: 1
    Dernier message: 13/01/2007, 00h11
  5. Calculs dans une requete avec conditions multiples
    Par Sha1966 dans le forum Access
    Réponses: 3
    Dernier message: 13/01/2006, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo