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

MS SQL Server Discussion :

Requête complexe avec incrémentation [2012]


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Requête complexe avec incrémentation
    Bonjour,

    Je tente de faire une requête update mais c'est complexe

    voici un résumé rapide
    un client signe un contrat pour l'année 2013 pour un prix de 1200€
    chaque année, ce client subi une augmentation variable exemple pour 2014 --> 8% de plus donc 8*1200=96 d'augmentation donc prix Final = 1296
    la ou ça se complique c'est que ça doit s’incrémenter

    Mes 2 tables souscription et ajustement_prix sont comme dans mon schéma (ci-dessous)

    Il me manque que les valeurs à mettre dans le champ PrixFinal

    Merci de votre aide.

    Mes tables à l'origine

    table souscription
    idsouscription, cotisationAnnuelle, dt_signature
    1, 1200, 2012,
    2, 978, 2013,

    table ajustement_prix
    idsouscription, Annee, %Augmentaion, %Reduction, PrixFinal
    1, 2012, 10, 10
    1, 2013, 8, 0
    1, 2014, 9, 0
    1, 2015, 7, 0

    2, 2013, 8, 8
    2, 2014, 9, 0
    2, 2015, 7, 2

    Ma table avec le résultat souhaité

    table ajustement_prix
    idsouscription, Annee, %Augmentaion, %Reduction, PrixFinal
    1, 2012, 10, 10, 1200 --> donc 10%(Aug) - 10%(Red) = ((0 * 1200(CotisAnnuel)) /100) = 0 + 1200 = 1200
    1, 2013, 8, 0, 1296 --> donc 8%(Aug) - 0%(Red) = ((8 * 1200(CotisAnnuel)) /100) = 96 + 1200 = 1296
    1, 2014, 9, 0, 1412.64 --> donc 9%(Aug) - 0%(Red) = ((9 * 1296(CotisAnnuel)) /100) = 116.64 + 1296 = 1412.64
    1, 2015, 7, 0, 1511.52 --> donc 7%(Aug) - 0%(Red) = ((7 * 1412.64(CotisAnnuel)) /100) = 98.88 + 1412.64 = 1511.52

    2, 2013, 8, 8, 978 --> donc 8%(Aug) - 8%(Red) = ((0 * 978(CotisAnnuel)) /100) = 0 + 978 = 978
    2, 2014, 9, 0, 1066.02 --> donc 9%(Aug) - 0%(Red) = ((9 * 978(CotisAnnuel)) /100) = 88.02 + 978 = 1066.02
    2, 2015, 7, 2, 1119.32 --> donc 7%(Aug) - 2%(Red) = ((5 * 1066.02(CotisAnnuel)) /100) = 53.30 + 1066.02 = 1119.32

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Full-stack
    Inscrit en
    Novembre 2010
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Full-stack

    Informations forums :
    Inscription : Novembre 2010
    Messages : 372
    Points : 489
    Points
    489
    Par défaut
    Citation Envoyé par laurent_sitbon Voir le message
    Bonjour,

    Je tente de faire une requête mais c'est complexe
    Bonjour,

    Quel genre de requête tentes tu de faire, un Select, update, delete où Insert?

    Cordialement.
    La recherche de la connaissance est une Lumière qui apaise le Cœur.
    Si une réponse vous a été utile , n'oubliez pas de voter en cliquant sur:.

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Type de requête Update
    Merci pour votre réponse .

    J'ai reformulé le message d'origine.

    Merci

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Merci de respecter la charte de postage en postant le DDL de vos table ainsi que des INSERT : http://www.developpez.net/forums/d96...vement-poster/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Full-stack
    Inscrit en
    Novembre 2010
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Full-stack

    Informations forums :
    Inscription : Novembre 2010
    Messages : 372
    Points : 489
    Points
    489
    Par défaut
    Bonjour,

    A voir ton écrit, on dénombre pas mal d'erreurs de débutant. Pour une bonne gestion, il faudrait stocker seulement les variables et non les calculs.

    D'abord pour commencer, je te dirai que ta colonne "PrixFinal", n'a pas sa place dans la table. C'est une colonne calculée, de surcroît évolutive. On peut la générer à tout moment par requête simple, dans une vue ou une procédure stockée. Je te conseillerai pour mieux faire d'insérer une colonne AnnéeEnCours pour estimer les années de variation des différents taux, et aussi de renommer la colonne Année en AnneSouscription.

    Les taux n'étant pas fixes, les calculs deviendront fastidieux lors des SELECTs.

    En SQL "%" est un mot clé de programmation, donc %Augmentation génère une donnée, alors que tu l'utilise comme nom de colonne. Il serait bon de le renommer Augmentation tout simplemnt, de même pour %Reduction.
    Donc pour bien faire, il ne restera que les colonnes idsouscription, Annee, %Augmentaion, %Reduction,.

    Donc l'Update de ta requête sans la colonne PrixFinal sera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Declare @Anneé float, @Augmentation float, @Reduction float, @id int
    UPDATE MaTable SET Année = @Annee, [Augmentation] = @Augmentation, [Reduction] = @Reduction WHERE id = @id
    Songe à renommer tes variables, surtout à suivre la méthodologie.

    Bien cordialement.
    La recherche de la connaissance est une Lumière qui apaise le Cœur.
    Si une réponse vous a été utile , n'oubliez pas de voter en cliquant sur:.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    vous pouvez passer par une requête recursive pour obtenir le résultat souhaité :

    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
     
    WITH CTE AS(
      SELECT
            ss.idsouscription
            ,aj.Annee
            ,aj.augmentation
            ,aj.Reduction
            ,((aj.augmentation - aj.reduction) / CAST(100 AS DECIMAL(x,y)) * ss.cotisationAnnuelle) + ss.cotisationAnnuelle As PrixFinal
      FROM ajustement_prix aj
      INNER JOIN souscription ss
          ON ss.idsouscription = aj.idsouscription    
      WHERE aj.annee = ss.dt_signature
     
      UNION ALL
     
      SELECT 
            CTE.idsouscription
            ,aj.Annee
            ,aj.augmentation
            ,aj.Reduction
            ,((aj.augmentation - aj.reduction) / CAST(100 AS DECIMAL(x,y)) * CTE.PrixFinal) + CTE.PrixFinal As PrixFinal 
      FROM CTE 
      INNER JOIN ajustement_prix aj
          ON CTE.idsouscription = aj.idsouscription    
      WHERE aj.annee = CTE.annee + 1
     )
    SELECT *
    FROM CTE
    ORDER BY idsouscription, annee
    En adaptant le transtypage en fonction du type de vos colonnes cotisation et reduction/augmentation

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Un grand merci
    Bonjour,
    Un grand merci à tous et surtout à aieeeuuuuu qui m'a trouvé la solution.

    J'ai modifier un peu la requete

    voici le résultat final qui fonctionne parfaitement (dans mon schema d'origine j'ai modifié quelque nom de champs afin de le rendre facile à expliquer)

    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
     WITH CTE AS(
      SELECT
            ss.idsouscription
            ,aj.Annee
            ,aj.PourcentAugmentation
            ,aj.PourcentReduction
            ,(((aj.PourcentAugmentation - aj.PourcentReduction) / 100) * ss.MontantCotisationAnnuelle) + ss.MontantCotisationAnnuelle As PrixFinal
      FROM souscriptions ss
      INNER JOIN  ReductionAnnuelle aj
          ON ss.idsouscription = aj.idsouscription    
      WHERE aj.annee = year(ss.dtsignature)
     
      UNION ALL
     
      SELECT 
            CTE.idsouscription
            ,aj.Annee
            ,aj.PourcentAugmentation
            ,aj.PourcentReduction
            ,(((aj.PourcentAugmentation - aj.PourcentReduction) / 100 ) * CTE.PrixFinal) + CTE.PrixFinal As PrixFinal 
      FROM CTE 
      INNER JOIN ReductionAnnuelle aj
          ON CTE.idsouscription = aj.idsouscription    
      WHERE aj.annee = CTE.annee +1
      )
     
    UPDATE r
       SET r.PrixFinal = c.PrixFinal
      FROM ReductionAnnuelle AS r
             INNER JOIN 
           CTE AS c 
             ON r.IdSouscription = c.IdSouscription and r.Annee=c.Annee
    Génial......

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête complexe avec 14 tables
    Par Kawabaumga dans le forum Développement
    Réponses: 7
    Dernier message: 14/05/2010, 10h24
  2. [AC-2007] Requête ajout avec incrément.
    Par Viggen0020 dans le forum Requêtes et SQL.
    Réponses: 20
    Dernier message: 21/10/2009, 11h26
  3. Requête complexe avec plusieurs lignes par table
    Par Iwazaru dans le forum Requêtes
    Réponses: 5
    Dernier message: 01/09/2009, 09h46
  4. Requète Complexe avec GROUP BY et classement descendant
    Par snoups58 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/10/2008, 18h44
  5. [SQL] Requête complexe avec appel multiple à la même table
    Par Julien Dufour dans le forum Langage SQL
    Réponses: 9
    Dernier message: 14/04/2005, 14h12

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