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 :

[SQL Server] nombre de dossier à une étape donnée


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut [SQL Server] nombre de dossier à une étape donnée
    Bonjour à tous,

    J'ai trois tables:


    - Dossiers qui contient des infos sur un dossier avec "id_dossier" comme clé primaire
    - Etapes qui contient les différentes étapes d'un dossier avec "id_etape" comme clé primaire et "position" pour indique l'emplacement de cette étape dans la chaine de production
    - Suivit_dossiers qui met en relation les dossiers et les étapes en rajoutant une date

    Ainsi, on peut tracer un dossier, savoir quand est-ce qui'il est passé à telle étape, savoir où il en est etc...

    Maintenant j'ai besoin d'une requête qui me renvoi le nombre de dossier à une étape donnée. En entré j'ai un identifiant d'étape mais... j'ai du mal...

    Quelqu'un peut me filer un coup d'pouce s'il vous plaît?

    Merci

    A bientôt

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    bonjour,

    ceci fonctionne t-il?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(id_dossier) from suivit_dossier where id_etape = xxx;
    en considerant que suivit_dossier a les colonnes id_dossier et id_etape

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Bah non ça ne fonctionne pas car justement, dans Suivit_dossiers on ajoute un enregistrement à chaque passage d'étape, en inscrivant la date de l'ajout, pour suivre le dossier.

    Du coup, lorsqu'un dossier est à l'étape on va dire 3, il est forcément passé par l'étape 1 et 2. Donc si on recherche les dossiers qui sont à l'étape 2, ce dossier ne doit pas être comptabilisé.

    J'ai essayé ça, ça marche, mais c'est long :

    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
     
    DECLARE @pIdEtape int
    SET @pIdEtape=15
    SELECT count(*) FROM Dossiers d
    INNER JOIN suivit_dossiers As s ON
    	s.id_dossier = d.id_dossier AND
    	s.id_etape = @pIdEtape AND
    	s.id_etape =
    	(
    		SELECT e3.id_etape FROM etapes e3
    		WHERE e3.position =
    		(
    			SELECT MAX(e.position) FROM Etapes e
    			INNER JOIN suivit_dossiers As s2 ON
    			s2.id_etape = e.id_etape AND
    			s2.id_dossier = d.id_dossier
    		)
    	)
    On peut la simplifier cette requête?

    Merci

  4. #4
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Merci de tenir compte des CONSEILS... à lire AVANT de POSTER, en particulier une description plus précise de votre schéma n'aurait pas été de trop.

    Si j'ai bien compris, la table des étapes est "figée", ldes dossiers sont créés en suivant un pattern défini par ces étapes, grâce à la table de suive, c'est bien cela ?

    Si oui, il y a mmoyen de simplifier votre requête avec un NOT EXISTS je pense.
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Oui exact, désolé, je vous met le schéma de ma base concernant la partie qui nous intéresse

    Et oui, en fait la table étape, on l'a rempli en dur, mais à l'avenir, on pourra en modifier/rajouter/supprimer/déplacer etc... c'est pour ça que la position intervient, sinon on se serait basé sur l'identifiant qui est auto incrément et on les aurait rempli dans l'ordre...

    Comment ça avec un NOT EXISTS?

    Merci beaucoup,

    Aurélien
    Images attachées Images attachées  

  6. #6
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    cette requête te ramène-t'elle bien la liste des dossiers arrivés à l'étape 3 (par exemple) et n'ayant pas encore atteint l'étape 4 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT id_Dossier
      FROM Dossiers D INNER JOIN Suivit_Dossiers S1
                              ON D.id_Dossier = S1.id_Dossier
                      INNER JOIN Etapes E1
                              ON S1.id_Etape = E1.id_Etape
     WHERE E1.position = 3
       AND NOT EXISTS (SELECT *
                         FROM Suivit_Dossiers S2 INNER JOIN Etapes E2
                                                 ON S2.id_Etape = E2.id_Etape
                        WHERE S2.id_Dossier = D.id_Dossier)
    Si oui, tu remplace le 3 par une variable, et le tour est joué
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Heu non, quelque soit la position de l'étape que je mets, ça ne me renvoi aucune ligne.

    Sinon en entrée j'ai l'identifiant de l'étape, pas la position..

    Erf c'est chaud

    Merci beaucoup

  8. #8
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Citation Envoyé par mister3957
    Heu non, quelque soit la position de l'étape que je mets, ça ne me renvoi aucune ligne.
    c'est normal, j'ai oublié un bout de clause WHERE ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT id_Dossier
      FROM Dossiers D INNER JOIN Suivit_Dossiers S1
                              ON D.id_Dossier = S1.id_Dossier
                      INNER JOIN Etapes E1
                              ON S1.id_Etape = E1.id_Etape
     WHERE E1.position = 3
       AND NOT EXISTS (SELECT *
                         FROM Suivit_Dossiers S2 INNER JOIN Etapes E2
                                                 ON S2.id_Etape = E2.id_Etape
                        WHERE S2.id_Dossier = D.id_Dossier
                          AND E2.position = (3+1))
    Si j'ai bien compris, que tu passe l'id de ton étape ou le numéro, c'est pareil, non ? Saus que mon 3+1 ne fonctionnera pas ...
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/06/2014, 12h58
  2. [SQL Server 2000] configurer ou supprimer une connexion
    Par drinkmilk dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/08/2005, 21h48
  3. [SQL Server]Recupération du résultat d'une procédure stockée
    Par navis84 dans le forum Bases de données
    Réponses: 8
    Dernier message: 04/04/2005, 20h53
  4. [SQL Server] Limiter le resultat d'une requête
    Par obiwan dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/06/2004, 11h25

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