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

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    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
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    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 expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    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
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    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 expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    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  
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    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 expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    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
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    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

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    J'ai essayé, ça ne fonctionne pas

    Nan en fait on me passe l'id_etape, et après, c'est dans la requête SQL qu'il faut faire intervenir la position.

    D'abord aller chercher la position de l'étape qui possède id_etape en identifiant, ensuite calculer le nombre de dossier dont la dernière position de l'étape dans la table suivit_dossier est celle de l'étape qui a l'identifiant passé en paramètre.

    Erf... c'est compliqué à expliquer

    Une petite requête vaut mieux qu'un long discourt :p

    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 e.id_etape FROM etapes e
    		WHERE e.position =
    		(
    			SELECT MAX(e.position) FROM Etapes e2
    			INNER JOIN suivit_dossiers As s2 ON
    			s2.id_etape = e2.id_etape AND
    			s2.id_dossier = d.id_dossier
    		)
    	)
    Cette requête fait le traitement que j'ai besoin, mais elle est longue à l'exécution... M'enfin tu vois où je veux en venir? Il faut que l'étape des dossiers comptabilisé soit l'étape envoyé en paramètre, et qu'en même temps ça soit la dernière étape (par position) de ces dossiers...

    Prise de tête ce truc

    A bientôt et mercie beaucoup

    Aurélien
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par mister3957
    J'ai essayé, ça ne fonctionne pas
    Ce qui signifie ? Tu n'obtiens pas les résultats escomptés ?

    Quel est approximativement le volume de tes tables, en nb de lignes ?

    Ca n'est plus du SQL, mais as-tu un index sur Suivit_Dossiers (id_Dossier, id_Etape) ?
    "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

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Alors dans ma table étape, j'en ai 15,
    Dans ma table dossiers j'en ai plus de 22000
    Et tous mes dossiers étant terminé, dans ma table Suivit_dossier j'en ai plus de 22000 * 15

    Pour mes teste, j'ai effacer, dans suivit dossier, la ligne qui référençait le dossier 1 avec l'étape 15.
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  12. #12
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Bonjour,

    En supprimant 2 tables qui me semblent superflues ds ta rq et en réorganisant 1 peu tes jointures ça donnerait ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT 	COUNT(*)
    FROM
    (
    SELECT	Suivi.idDossier
    FROM	Suivi 
    INNER JOIN Etape 
    ON	Suivi.idEtape = Etape.idEtape
    LEFT JOIN Etape Position
    ON	Suivi.idEtape = Position.idEtape
    AND	Position.idEtape = 'ton parametre ici'
    GROUP BY Suivi.idDossier
    HAVING MAX(Etape.positionEtape) = MAX(Position.positionEtape)
    ) AS tmp;
    Sinon même remarque que Xo, vérifies aussi tes indexes.

    A +

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Merci beaucoup, j'essaye ça dès lundi

    Sinon la clé primaire de suivit_dossiers c'est le couple (id_dossier,id_etape), est-ce que c'est bien comme ça?

    Merci
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

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