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 :

Select / table + ajout col. & filtrage sur résultat autre ProcStoc


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 174
    Points
    174
    Par défaut Select / table + ajout col. & filtrage sur résultat autre ProcStoc
    Bonjour,

    Je suis débutant en SQL, je travaille avec SqlServer 2012. Voici mon problème :

    J'ai 1 table "Client" et 1 table "Commandes"
    Je souhaite via 1 procédure stockée demander la liste des clients à relancer avec certains critères (Région...).
    Je souhaite que me soit retournée 1 table contenant pour chaque ligne NomClient, RelanceCodeMotif, RelanceMontant, RelanceDate.

    Le Nom client & les critères de filtrage passés sont dans la table Client, c'est facile.
    Pour les 3 colonnes Relance... ça doit provenir d'une autre procédure stockée qui analyse les commandes du client et me retourne 1 ligne avec ces 3 infos : RelanceCodeMotif, RelanceMontant & RelanceDate.
    Le codeMotif vaut 0 s'il ne faut pas relancer, >0 s'il le faut.

    Le chalenge c'est d'écrire cette requête select sur la table Client :
    - En filtrant les clients sur les critères passés (région...) : je sais faire.
    - En filtrant ensuite sur "RelanceMotif > 0" : si possible éviter d'appeler la ProcStoc pour les clients déjà filtrés ci-dessus car cette dernière fait 1 travail très lourd d'analyse de toutes les commandes du client qui sera chronophage.
    - Ajouter ces 3 colonnes dans ma table retournée.

    En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select Cli.Nom, Rel.Motif, Rel.Mt, Rel.Date
     From Clients As Cli
     Join GetInfosRelance Cli.Code ??? As Rel
     Where Cli.Pays = 'F' AND ... AND Rel.Motif > 0

    Merci de m'expliquer la syntaxe de la procédure principale et de la seconde procédure.
    J'ai déjà 1 ProcStoc GetInfosRelanceClient qui reçoit le code client, fait ce travail et retourne 1 ligne avec ces 3 infos : je l'utilise pour 1 seul client. Je voudrais maintenant avoir aussi la liste des clients à relancer et si possible réutiliser le code existant.
    Vais-je pouvoir utiliser GetInfosRelanceClient ou est-ce que ça devra être 1 autre ProcStoc qui retournera tous les Clients à relancer mais qui devrait alors recevoir la liste des codes clients pour lesquels je veut ces infos ou 1 Proc qui fera le premier filtrage puis complètera les colonnes et retournera le tout ?
    Je voudrais éviter de traiter manuellement chaque ligne client (cursor ou autre) pour des questions de performance.


    Merci pour votre aide.

  2. #2
    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,

    difficile d'être précis et certain sans voir au moins le code de votre procédure.

    Mais si effectivement elle prend un unique code client en paramètre, alors il vous faudra passer par un curseur, ce qui n'est évidemment pas une bonne idée.
    Ne pouvez-vous passer cette procédure en fonction table, idéalement une fonction table en ligne ?

  3. #3
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 174
    Points
    174
    Par défaut
    Que veut tu dire par table en ligne ?

    Voici en résumé la procédure "GetInfosRelanceFor1Client" :
    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
     
    ALTER PROCEDURE [dbo].[GetInfosRelanceFor1Client]
    	@NumDos 		int,
    	@RelDate 		date = null OUTPUT,
    	@RelMont 		int   = null OUTPUT,
    	@RelMotif 		tinyint OUTPUT
    AS
    BEGIN
    	SET NOCOUNT ON;
            ... travail sur les commandes du client lues avec 1 curseur (pas possible de faire autrement ici)...
            ... Exemple de retour :
            Set @RelMotif = 1  -- à relancer pour motif 1
            Set @RelDate = x.Date
            Set @RelMont = @MtCalculé
    END
    Sachant que RelMotif sera à 0 s'il n'y a pas lieu de relancer.

    Cette Procédure est donc appelée en faisant 1 boucle sur tous les clients et pour chacun on appelle la requête en passant le N° du client.

  4. #4
    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
    Citation Envoyé par bib34690 Voir le message
    Que veut tu dire par table en ligne ?
    Je parlais des fonctions tables en ligne


    Citation Envoyé par bib34690 Voir le message
    ... travail sur les commandes du client lues avec 1 curseur (pas possible de faire autrement ici)...
    Pourquoi ?
    C'est pourtant certainement par là qu'il faut commencer !

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/01/2013, 12h18
  2. Réponses: 11
    Dernier message: 16/05/2011, 14h36
  3. Réponses: 7
    Dernier message: 05/06/2008, 13h54
  4. Requete sur une table qui pointe 2 fois sur une autre
    Par Satch dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/01/2006, 08h48
  5. pb d'insertion avec un SELECT sur une autre table
    Par epeichette dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/01/2005, 22h58

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