Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/09/2011, 19h27   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 39
Points : 13
Points : 13
Par défaut Requete INSERT avec sous-requête

Bonjour à tous

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

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

Citation:
Nomenclature
1,2,2
1,3,1
Citation:
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 :
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
nemo67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 10h23   #2
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
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 ?
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 11h52   #3
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Dans tous les cas, ta réponse se trouve dans quelquechose du genre :

Code :
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.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 12h02   #4
Candidat au titre de Membre du Club
 
Inscription : janvier 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 39
Points : 13
Points : 13
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é
nemo67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 14h07   #5
Candidat au titre de Membre du Club
 
Inscription : janvier 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 39
Points : 13
Points : 13
ok je ne connaissais pas cette syntaxe. J'ai modifié la requête pour quelle réponde à ce que je souhaitais faire :

Code :
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 ...
nemo67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h16.


 
 
 
 
Partenaires

Hébergement Web