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 INSERT avec sous-requête


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 43
    Points : 28
    Points
    28
    Par défaut Requete INSERT avec sous-requête
    Bonjour à tous

    j'ai deux tables dont voici la description simplifiée :

    Nomenclature
    IDART
    IDARTFILS
    QTE
    Tarif
    IDART
    DATEPRIX
    PRIX
    et le jeu d'essai suivant :

    Nomenclature
    1,2,2
    1,3,1
    Tarif
    2,1/10/2011,5
    2,15/10/2011,6
    2,27/10/2011,7
    3,1/10/2011,2
    3,25/10/2011,3
    3,5/11/2011,4
    A partir de ce jeu d'essai j'aimerai insérer une nouvelle ligne dans tarif correspondant à la somme des prix des composants les plus récents ayant la date de tarif <= à une date x. La date de cette nouvelle ligne doit correspondre à la plus grande date de tarif trouvée sur les composants.

    J'arrive à faire la requête pour calculer les valeurs :

    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
     
    WITH TMP_TARIF(IDART, DATEPRIX) 
         AS (SELECT T.IDART, 
                    MAX(T.DATEPRIX) 
             FROM   T_TARIF T 
             WHERE  T.DATEPRIX <= { d '2011-10-30'} 
             GROUP  BY T.IDART) 
    SELECT SUM(T.PRIX * D.QTE), 
           MAX(T.DATEPRIX) 
    FROM   T_TARIF T 
           JOIN T_NOMENCLATURE D 
             ON T.IDART = D.IDARTFILS 
           JOIN TMP_TARIF T2 
             ON T2.IDART = T.IDART 
                AND T.DATEPRIX = T2.DATEPRIX 
    WHERE  D.IDART = 1
    Ce qui me donne un prix de 17 (7*2 + 3 * 1) avec une date au 27/10/2011

    mais pour insérer la ligne dans la table ou alors la mettre à jour si celle ci existe déjà ... je sèche !

    Le but ultime étant de maintenir le prix de l'article composé via des triggers lors que l'on modifie la table nomenclature (ajout d'un composant, modif quantité ...) ou modifie la table des tarifs (ajout d'un prix, modif du tarif ...)

    pour info je suis en SQL SERVER 2005



    Merci

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Je ne comprends rien :
    - soit à ton modèle des données
    - soit à ton jeu de test

    => nomenclature.idartfils n'est pas une clé étrangère vers nomenclature(idart)
    Etrange je trouve

    => tarifs.idart n'est pas une clé étrangère vers nomenclature(idart)
    Ca, c'est encore plus étrange

    Du coup, je lance ta requête sur la base de test que j'ai créé d'après tes infos et...

    Super, j'ai un tarif de 17 pour la date du 27/10/2011 mais on n'a aucune idée de :
    - pour quel idart ou idartfils
    - ce qu'on doit en faire

    Tu peux vérifier :
    1/ ton jeu de test
    2/ ta question, histoire qu'on sâche ce qu'on doit faire du résultat ?

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Dans tous les cas, ta réponse se trouve dans quelquechose du genre :

    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
    WITH TMP_TARIF(IDART, DATEPRIX) 
         AS (SELECT T.IDART, 
                    MAX(T.DATEPRIX) 
             FROM   TARIFs T 
             WHERE  T.DATEPRIX <= { d '2011-10-30'} 
             GROUP  BY T.IDART) 
    insert into tarifs (PRIX, DATEPRIX, IDART)
    SELECT SUM(T.PRIX * D.QTE), 
           MAX(T.DATEPRIX), MAX(d.idartfils) + 1
    FROM   TARIFs T 
           JOIN NOMENCLATURE D 
             ON T.IDART = D.IDARTFILS 
           JOIN TMP_TARIF T2 
             ON T2.IDART = T.IDART 
                AND T.DATEPRIX = T2.DATEPRIX 
    WHERE  D.IDART = 1;
    Au détail près qu'avec les informations que tu donnes, j'ai l'impression que la requête fait n'importe quoi. Mais syntaxiquement, c'est ça.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    Merci

    j'ai simplifié les tables, il manque notamment une table article car elle n'intervient pas dans la requête

    => nomenclature.idartfils n'est pas une clé étrangère vers nomenclature(idart)
    --> idart et idartfils sont des clés étrangères vers la table article

    => tarifs.idart n'est pas une clé étrangère vers nomenclature(idart)
    --> idart serait clé étrangères vers la table article

    La requête donne le résultat pour le composé IDART = 1. J'ai figé les conditions du where pour simplifier mais effectivement il faudra le faire pour tous les articles composés. Cette partie ne me pose pas de problème

    L'idée serait d'ajouter une ligne dans les tarifs quand :
    - on modifie un élément de la nomenclature
    - on modifie un prix d'un des composants du composé

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    ok je ne connaissais pas cette syntaxe. J'ai modifié la requête pour quelle réponde à ce que je souhaitais faire :

    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
     
    WITH TMP_TARIF(IDART, DATEPRIX) 
         AS (SELECT T.IDART, 
                    MAX(T.DATEPRIX) 
             FROM   T_TARIF T 
             WHERE  T.DATEPRIX <= { d '2011-10-30'} 
             GROUP  BY T.IDART) 
    insert into T_TARIF (IDART, PRIX, DATEPRIX)
    SELECT D.IDART, SUM(T.PRIX * D.QTE), 
           MAX(T.DATEPRIX)
           FROM   T_TARIF T
           JOIN T_NOMENCLATURE D 
             ON T.IDART = D.IDARTFILS 
           JOIN TMP_TARIF T2 
             ON T2.IDART = T.IDART 
                AND T.DATEPRIX = T2.DATEPRIX 
    --WHERE  D.IDART = 1 
    group by D.IDART;
    Cette requête insère bien une ligne dans les tarifs pour la ligne "composée" avec un prix correspondant à la somme des prix des composants pour une date donnée.

    reste plus qu'à faire ce traitement via trigger quand :

    - on ajout / modifie une nomenclature
    - on ajoute/modifie un prix de composant

    j'essaye de faire cela ...

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

Discussions similaires

  1. Insert multiples avec sous-requête SELECT
    Par lolymeupy dans le forum Requêtes
    Réponses: 6
    Dernier message: 08/08/2011, 18h57
  2. Pb INSERT avec sous requête EXCEPTION JOIN
    Par jean-noel.guillaume dans le forum DB2
    Réponses: 2
    Dernier message: 29/12/2010, 15h32
  3. insertion avec sous requête et ON DUPLICATE KEY
    Par epeichette dans le forum Requêtes
    Réponses: 5
    Dernier message: 05/10/2009, 16h14
  4. Requete UPDATE avec sous-requète
    Par alaingui dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 27/06/2008, 22h16
  5. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 19/03/2004, 00h20

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