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

Langage SQL Discussion :

Mettre à jour la franchise sur une requête


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Inscrit en
    Avril 2004
    Messages
    646
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 646
    Par défaut Mettre à jour la franchise sur une requête
    Bonjour,

    Voilà, j'ai un gros problème sur un requête. Je souhaite réaliser une requête de mise à jour (la table comporte 4000 lignes !) en appliquant une franchise annuelle dégressive à chaque société pour le produit x comme suit. Je ne sais pas comment m'y prendre !

    J'ai une table qui comporte les champs suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SOCIETE
    NUMPRODUIT
    NOCAMPAGNE
    PERIODE
    CONSOMMATION
    FRANCHISE
    BASECONSOMMATION
    TAUX
    MONTANT
    La période est sous forme MM/AAAA (ex. : 06/2004).

    La franchise est annuelle de 30000 cl, est dégréssive sur l'année pour chaque société. La 1ère période annuelle (généralement 01/xxxx mais ça peut être 02 ou 03/xxxx), la franchise est de 30000 cl. A chaque ligne supplémentaire, elle est calculée en soustrayant la consommation, jusqu'à ce qu'elle atteigne 0.

    Comment faire en SQL ?

    Pouvez-vous m'aider ?

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Requête qui utilise un alias sur la table en mutation, ce qui n'est pas dans la norme et n'est pas supporté par tous les moteurs (mais l'est par ORACLE) ainsi que SUBSTR qui est spécifique ORACLE, mais facile à transcrire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE dvp_Franchise a
    SET Franchise = (SELECT CASE WHEN Sum(b.Consommation) < 30000
                                 THEN Sum(b.Consommation)
                                 ELSE 30000
                            END
                     FROM dvp_Franchise b
                     WHERE a.Societe = b.Societe
                       AND a.NumProduit = b.NumProduit
                       AND SubStr(a.Periode, 4, 4)  = SubStr(b.Periode, 4, 4)
                       AND SubStr(a.Periode, 1, 2) >= SubStr(b.Periode, 1, 2));
    Et si tu es sous ORACLE (ou PostGreSQL), une solution encore moins normée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE dvp_Franchise a
    SET Franchise = (SELECT Least(Sum(b.Consommation), 30000)
                     FROM dvp_Franchise b
                     WHERE a.Societe = b.Societe
                       AND a.NumProduit = b.NumProduit
                       AND SubStr(a.Periode, 4, 4)  = SubStr(b.Periode, 4, 4)
                       AND SubStr(a.Periode, 1, 2) >= SubStr(b.Periode, 1, 2));
    Si tu es sous SQLServer, une solution plus normée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE dvp_Franchise  
    SET Franchise = (SELECT CASE WHEN Sum(b.consommation) < 30000 
                                 THEN Sum(b.consommation) 
                                 ELSE 30000 
                            END 
                     FROM dvp_Franchise b 
                     WHERE dvp_Franchise.Societe = b.Societe 
                       AND dvp_Franchise.NumProduit = b.NumProduit 
                       AND SubString(dvp_Franchise.Periode, 4, 4)  = SubString(b.Periode, 4, 4) 
                       AND SubString(dvp_Franchise.Periode, 1, 2) >= SubString(b.Periode, 1, 2));

  3. #3
    Membre éclairé

    Inscrit en
    Avril 2004
    Messages
    646
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 646
    Par défaut
    Merci beaucoup pour ta réponse

    Mais... je suis sous Access !

Discussions similaires

  1. [MySQL] Mettre un score (valeur) sur une requête avec LIKE
    Par yule dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/10/2010, 16h05
  2. [AC-2003] Message d'erreur sur une requête mise à jour
    Par souketou dans le forum VBA Access
    Réponses: 4
    Dernier message: 10/06/2009, 09h33
  3. Problème sur une requête de mise à jour entre 2 tables
    Par Throbb dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 04/03/2009, 14h43
  4. Aide sur une requête mise à jour
    Par nomade333 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 07/05/2008, 13h44

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