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 :

Traiter une liste en ramenant des infos supplementaires


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 72
    Points : 46
    Points
    46
    Par défaut Traiter une liste en ramenant des infos supplementaires
    Bonjour,

    Je ne vois pas comment faire pour appliquer un traiteement sur chacun des items retournés par d'une requete (exemple: une liste de code article retournés par un Select ...)
    Le traitement serait d'effectuer d'autres requetes ayant le code article en paramètre de la clause Where (exemple : ramener le dernier prix d'achats non nul, le dernier prix d'inventaire, la quantité en stock .. de cet article)

    Comment faire cela ?

    Merci


    Franck

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Il faudrait nous donner un peu plus d'informations pour pouvoir te répondre.
    As-tu regardé ce que pouvaient t'apporter les jointures ?

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 72
    Points : 46
    Points
    46
    Par défaut
    Admettons que la de base requete soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT code 
    FROM Table_Articles 
    WHERE Alpha = 1;
    et que le resultat soit : X000036, X000704, X001103, X001205

    Je veux aussi pouvoir executer pour chacun d'eux plusieurs requetes dont un exemple pourrait etre le suivant :
    => je ne veux que le dernier prix unitaire d'achat en date et non nul de l'article specifique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Top(1) (MontantHT/QteCom) as PrixUnit, NumDocAchat, dateAchat
    FROM Table_Lignes_Achats
    WHERE Code='X000036'
    AND QteCom>0
    AND MontantHT>0
    ORDER BY dateAchat Desc
    ....

    Idem pour 2 ou 3 autre requêtes de ce type

    Je bloque sur le fait que mes requêtes de 2eme niveau est un paramètre article pour chacun des items de la liste de base !!!

    Une idée

    Merci

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonsoir,

    Quel SGBD ?

    Si vous ne voulez récuperer que le dernier prix unitaire une solution peut être celle là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
     a.Code,
     (SELECT TOP(1) la.MontantHT / la.QteCom
      FROM Table_Lignes_Achats AS la
      WHERE la.Code = a.code
      ORDER BY la.DateAchat DESC) AS DernierPrixUnitaire
    FROM article AS a
    WHERE a.Alpha = 1
    ++

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 72
    Points : 46
    Points
    46
    Par défaut
    Ta solution fonctionne. J'ai bien plus de champs à ramener mais si je fais une sous requête par champ alors le résultat est conforme et OK.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Code,
                (Select Prix  From ... T2  Where T1.code=T2.code) as DernierPrixAchat,
                (Select Qte_Stk  From ... T3  Where T1.code=T3.code) as QteTotal Stocks,
                (Select PrixInventaire  From ... T4  Where T1.code=T4.code) as PrixDernierInventaire
     
      FROM  T_Article T1
      WHERE T1.Alpha >0  AND ....
    Par contre ma liste de codes articles (1er requête) à traiter fait 5800 codes.
    Mon serveur est un SQL Server 2005 et l'exécution de ma requête prend 5 sec.

    Ce n'est pas une requête exécutée souvent, c'est juste une requête de vérification de prix et de cohérence.

    Existe il une autre solution pour traiter cela d'une manière différente ?

    Merci

    Franck

  6. #6
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Effectivement sur un jeu de données important cela ne sera pas très performant.

    Essayez ceci : (en adaptant vos nom de colonnes selon vos besoins)

    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
    SELECT 
    	a.Code,
    	la.MontantHT,
    	la.QteCom,
    	la.DateAchat
    FROM article AS a
    INNER JOIN 
    (
     SELECT 
    	RANK() OVER(PARTITION BY Code ORDER BY DateAchat DESC) AS rang,
    	Code,
    	MontantHT,
    	QteCom,
    	DateAchat
     FROM Table_Lignes_Achats
    ) AS la
    ON a.Code = la.Code
    WHERE a.Alpha = 1
     AND la.rang = 1
    ++

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/03/2008, 12h25
  2. Réponses: 3
    Dernier message: 12/12/2007, 12h39
  3. Réponses: 4
    Dernier message: 25/05/2007, 16h25
  4. Trier une liste en comparant des doubles
    Par babylone7 dans le forum Langage
    Réponses: 10
    Dernier message: 03/05/2007, 11h38
  5. Réponses: 1
    Dernier message: 25/04/2007, 16h04

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