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 :

Récupération de résultat


Sujet :

Langage SQL

  1. #21
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 934
    Points : 348
    Points
    348
    Par défaut
    p.s le fichier n'est qu'un exemple, j'ai pris 3 entreprises, mais il peut y en avoir bien plus je suppose, on sait jamaislol

    En gros je met ma condition where numEnt = 1234 et il devrait me sortir les résultats de pierre , paul et jacques , dans l'entreprise 1234 mais aussi 9123,5678,150,1252 etc.. durant l'année 2017, apres je pense qu'ils n'ont pas changé 36 fois de sociétés, juste une ou 2 voir 3 maximum

  2. #22
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    On procède étape par étape. J'ai bien compris que le besoin est d'avoir les autres entreprises dans lesquelles ont travaillé les personnes qui travaillent actuellement dans l'entreprise 1234.

    Le principe de base pour la réponse à un tel besoin a été donné dans mon message #2 :
    A) On commence par chercher les personnes qui travaillent dans l'entreprise 1234
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT p.prs_nom nom_personne,
    	p.prs_prenom prenom_personne,
    	e.ent_nom nom_entreprise
    FROM personne p
    INNER JOIN entreprise e ON e.ent_id = p.prs_id_entreprise
    WHERE e.ent_num_ent = '1234'
    Note : Ma requête ne tient pas compte du statut de la personne dans l'entreprise, si elle est toujours en poste ou pas... Qu'est-ce qui peut déterminer ça pour ne retenir que les personnes souhaitées, à vous de le savoir.

    B) Ensuite, on fait une jointure sur cette requête pour avoir les entreprises où ont travaillé ces personnes dans le passé.
    Là aussi, à vous de savoir comment on récupère ces anciennes entreprises. Est-ce dans les tables archive ?

    Voilà le principe général mais, encore une fois, sans la structure exacte de vos tables, il est bien difficile de vous aider.

    Ne cherchez pas tout de suite à récupérer toutes les informations que vous souhaitez dans le SELECT de la requête principale. Concentrez-vous sur le besoin essentiel en ne récupérant que les identifiants de la personne et de ses entreprises.

    Si vous arrivez à obtenir le genre de SELECT ci-dessous, les jointures à faire pour avoir les autres informations souhaitées seront assez faciles à ajouter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT idPersonne, idEntrepriseActuelle, idAncienneEntreprise

  3. #23
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 934
    Points : 348
    Points
    348
    Par défaut
    A) On commence par chercher les personnes qui travaillent dans l'entreprise 1234
    ça c'est ok, je me suis fais une requête avec toute les jointures, pour sélectionner toutes les entreprises d'un salarié


    B) Ensuite, on fait une jointure sur cette requête pour avoir les entreprises où ont travaillé ces personnes dans le passé.
    ok

    Là aussi, à vous de savoir comment on récupère ces anciennes entreprises. Est-ce dans les tables archive ?
    Non toujours dans la table entreprise, d'après ce que j'ai pu remarqué, on a plusieurs lignes dans la table par exemple :
    ident 1 - entreprise 1 idrefpersonne1
    ident2 - entreprise 2 idrefpersonne2
    ident3 - entreprise 3 idrefpersonne3
    etc......

    et la table personne
    id1 -- Pierre -- idref_Ent1
    id2 -- paul -- idref_Ent1
    id3 -- Jacques -- idref_Ent2
    id4 -- Gerard -- idref_Ent2
    id5 -- paul -- idref_Ent2
    id6 -- paul -- idref_Ent6

    Donc avec le requête techniquement s'il retourne Paul, on doit voir qu'il a travaillé dans l'entreprise Entreprise1 et l'entreprise2.

    Pour expliquer comment se fait la jointure entre personne et entreprise j'ai fais un petit schema, voir piece jointe, merci

  4. #24
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 934
    Points : 348
    Points
    348
    Par défaut
    Si vous arrivez à obtenir le genre de SELECT ci-dessous, les jointures à faire pour avoir les autres informations souhaitées seront assez faciles à ajouter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part

    SELECT idPersonne, idEntrepriseActuelle, idAncienneEntreprise


    je regarde...

  5. #25
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 934
    Points : 348
    Points
    348
    Par défaut
    Bonjour!
    sinon j'ai pensé tout simplement à faire une union ... j'aurais ma requete du genre :


    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
    20
     
    (
    select ......
    from.....
    inner join .....
    inner join .....
    where numEntreprise = $NumEnt ( exemple 1234 )
    and date >= 01/01/2017
    and date <= 31/01/2017 
    )
    union
    (
    select ......
    from.....
    inner join .....
    inner join .....
    where numEntreprise <> $NumEnt ( exemple 1234 )
    and date >= 01/01/2017
    and date <= 31/01/2017
    )
    donc j'aurais une liste avec toute la liste des personnes dans l'entreprise 1234 et la liste des personnes n'étant pas dans l'entreprise 1234 , durant l'année 2017, a la fin je rajoute order by numEnt par exemple mais je me pose une question, l'union si je dis pas de beitse il supprime les doublons ?
    MERCI !

  6. #26
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 400
    Points
    28 400
    Par défaut
    UNION supprime bien les doublons alors que UNION ALL retourne toutes les lignes trouvées, y compris les doublons.

  7. #27
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par android59 Voir le message
    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
    20
     
    (
    select ......
    from.....
    inner join .....
    inner join .....
    where numEntreprise = $NumEnt ( exemple 1234 )
    and date >= 01/01/2017
    and date <= 31/01/2017 
    )
    union
    (
    select ......
    from.....
    inner join .....
    inner join .....
    where numEntreprise <> $NumEnt ( exemple 1234 )
    and date >= 01/01/2017
    and date <= 31/01/2017
    )
    Euh... là vous faites l'union de ceux qui ont travaillé dans l'entreprise $nument en 2017 avec ceux qui ont travaillé dans une autre entreprise en 2017. Je n'ai pas compris votre besoin ainsi et je ne vois pas à quoi cela va vous servir. Autant directement supprimer la condition numEntreprise = $NumEn et ne faire qu'une requête sans union !

    Et quand je vois vos INNER JOIN, je continue de penser que vous vous compliquez la vie en voulant récupérer toutes les informations tout de suite alors que, si j'ai bien compris, vous n'avez besoin que de l'identifiant des personnes ayant travaillé dans l'entreprise $nument, fut-ce en 2017.
    D'ailleurs, au passage, votre double condition sur la date peut s'exprimer plus simplement ainsi : EXTRACT(YEAR FROM la_colonne_date) = 2017. C'est du SQL standard et ça devrait passer sous Oracle, à l'éventuel formatage de la colonne de date près (TO_DATE) si la colonne est en fait de type texte.

  8. #28
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 934
    Points : 348
    Points
    348
    Par défaut
    Bonjour,
    figurer j'avais envisager la même solution , carrément supprimer le paramètre, mais en haut lieu, il ne veulent pas lol.


    Si je comprends bien la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXTRACT(YEAR FROM la_colonne_date) = 2017
    c'est equivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    and date >= 01/01/2017
    and date <= 31/01/2017
    Je connaissais pas cette commande.

    Edit : j'ai tester sans le numéro entreprise :
    avec la condition : 280 resultats
    sans la condition : 39755 resultats environ donc je crois qu'elle est utile

  9. #29
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par android59 Voir le message
    Si je comprends bien la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXTRACT(YEAR FROM la_colonne_date) = 2017
    c'est equivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    and date >= 01/01/2017
    and date <= 31/01/2017
    Non c'est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...madate >= '2017-01-01' and madate <= '2017-12-31'
    Notez que je préfère nommer une colonne "madate" plutôt que "date" qui est un nom réservé

    Citation Envoyé par android59 Voir le message
    Je connaissais pas cette commande
    Ce n'est pas une commande, mais une fonction

  10. #30
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Au temps pour moi ! J'avais mal lu la requête et je pensais que la restriction était sur toute l'année 2017 et non pas sur janvier 2017.

    Dans ce cas, il vaut mieux utiliser BETWEEN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE la_colonne_date BETWEEN '2017-01-01' AND '2017-01-31'

  11. #31
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 934
    Points : 348
    Points
    348
    Par défaut
    Bonjour,
    ok merci à toi dessolé pour le temps de réponse, je suis sur autre chose par moment.

    En fait, je radote peut être, j'ai posé le problème autrement et simplement, supposons que j'ai deux tables:
    personne : idpersonne,nom,prenom,age,etc...
    entreprise: identreprise,nomEntreprise,numEnt,Entetc......
    periode:id, date ,etc....

    et ma requête ( voir plus haut ) que je simplifie au max
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select ......
    from.....
    inner join .....
    inner join .....
    inner join .....
    where numEnt=1234
    and dateDebut betwween 01/01/2017 and 31/12/2017
    mon soucis est que je veux le personne dans l'entreprise 1234, mais ayant travaillé dans d' autres entreprises, durant la période 2017, avec comme condition obligatoire where numEnt=1234 car dans mon logiciel de requete
    1234 est un paramètre ->$numentreprise
    J'ai déjà proposé d'enlevé ce paramètre mais on va avoir des personnes ne travaillant pas dans l'entreprise 1234, se pourrait il qu'il faudrait faire une sous requête quelque part peut etre ?

  12. #32
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    supposons que j'ai deux tables:
    personne : idpersonne,nom,prenom,age,etc...
    entreprise: identreprise,nomEntreprise,numEnt,Entetc......
    periode:id, date ,etc....
    Ça en fait 3 !

    je veux le personne dans l'entreprise 1234 ... durant la période 2017
    Dans vos tables, je ne vois pas de colonne permettant de faire la relation entre la personne et l'entreprise. Je suppose que c'est dans le etc. de la table periode ?
    Cette table période à une structure de ce genre ?
    periode (id, date_debut, date_fin, idpersonne, identreprise...)

    Alors pour l'extrait de besoin que j'ai cité, et comme déjà dit bien plus haut dans la discussion, cette requête est suffisante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT idpersonne
    FROM periode
    WHERE identreprise = '1234'
    	AND date_debut BETWEEN '2017-01-01' AND '2017-12-31'
    mais ayant travaillé dans d' autres entreprises, durant la période 2017
    On complète la requête précédente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT DISTINCT p1.idpersonne
    FROM periode p1
    WHERE identreprise = '1234'
    	AND p1.date_debut BETWEEN '2017-01-01' AND '2017-12-31'
    	AND EXISTS
    	(
    		SELECT *
    		FROM periode p2
    		WHERE p2.idpersonne = p1.idpersonne
    			AND p2.date_debut BETWEEN '2017-01-01' AND '2017-12-31'
    			AND p2.identreprise <> '1234'
    	)
    Adaptez ma requête à vos tables mais, pour le moment, en ne récupérant que les idpersonne comme je l'ai fait. Pas besoin de jointure !
    Testez-là et revenez nous dire si ça marche et ensuite on complètera la requête en fonction des informations que vous voulez récupérer.

  13. #33
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 934
    Points : 348
    Points
    348
    Par défaut
    je l'ai testé et étrangement pour certaines personnes, j'ai toujours les personnes de l'entreprise 1234 :s il me manque toujours des lignes

  14. #34
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par android59 Voir le message
    je l'ai testé et étrangement pour certaines personnes, j'ai toujours les personnes de l'entreprise 1234 :s il me manque toujours des lignes
    Euh... pas compris là !

    j'ai toujours les personnes de l'entreprise 1234
    Ben c'est ce que vous voulez, non ?
    Vous vouliez bien les personnes de l'entreprise 1234 ayant travaillé dans d'autres entreprises sur la période considérée, non ?

  15. #35
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 934
    Points : 348
    Points
    348
    Par défaut
    oui mais ça marche pas :s, voici un exemple de la requete envoyé, en reprenant l'exemple plus haut :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    SELECT  DISTINCT numero_ent AS Matricule,
     
    FROM        Tablepaiement3 t1
    INNER JOIN        archive2 t2		ON        t1.idrefT3 = t2.idrefT3
    INNER JOIN        archive1 t3		ON        t2.idrefT3 = t3.id
    INNER JOIN        entreprise t4		ON        t3.idrp=t4.id
    INNER JOIN        personne t5		ON        t4.idrefT5=t5.idrefT5
    INNER JOIN        campagneExercice1 t6		ON        t3.idreft6 = t6.id
    INNER JOIN        tablePaiement2 t7		ON        t1.idrefT7= t7.id
    INNER JOIN        entreprise t8		ON        t8.id=t2.c211_idEnt
    INNER JOIN        tableRelationEnt t9		ON        t9.idrp_1 =t8.id	AND     t9.idrp_2 =t4.id
     
    WHERE    t8.x503_matricule  = '$NumEntreprise' --ici je renseigne le numéro entreprise
    AND     t7.dateexercice   >= to_date('$anneeRecherche/01/01','yyyy/mm/dd')
    AND     t7.dateexercice   <= to_date('$anneeRecherche/12/31','yyyy/mm/dd')
    AND     t2.statutpersonne IN ('ETAM' ,'ETAMA','ETAMB','IAC','IAC1','IAC2' ,'ING')
     
    and EXISTS
    (
    		SELECT  DISTINCT numero_ent AS Matricule,
    		FROM        Tablepaiement3 t1
    		INNER JOIN        archive2 t2		ON        t1.idrefT3 = t2.idrefT3
    		INNER JOIN        archive1 t3		ON        t2.idrefT3 = t3.id
    		INNER JOIN        entreprise t4		ON        t3.idrp=t4.id
    		INNER JOIN        personne t5		ON        t4.idrefT5=t5.idrefT5
    		INNER JOIN        campagneExercice1 t6		ON        t3.idreft6 = t6.id
    		INNER JOIN        tablePaiement2 t7		ON        t1.idrefT7= t7.id
    		INNER JOIN        entreprise t8		ON        t8.id=t2.c211_idEnt
    		INNER JOIN        tableRelationEnt t9		ON        t9.idrp_1 =t8.id	AND     t9.idrp_2 =t4.id
     
    		WHERE    t8.x503_matricule  <> '$NumEntreprise'
    		AND     t7.dateexercice   >= to_date('$anneeRecherche/01/01','yyyy/mm/dd')
    		AND     t7.dateexercice   <= to_date('$anneeRecherche/12/31','yyyy/mm/dd')
     
     
    		AND     t2.statutpersonne IN ('ETAM' ,'ETAMA','ETAMB','IAC','IAC1','IAC2' ,'ING')
     
    )
    je suis obligé de faire les jointures, pour les conditions à la fin en fait.
    Resultat obtenu en filtrant par matricule :
    Initialement : j'obtenais 3 lignes - attendu 7lignes
    avec cette requete ; j'obtiens 1 seul ligne mais si j'enleve le distinct ça me remet 3 lignes

  16. #36
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    je suis obligé de faire les jointures, pour les conditions à la fin en fait.
    Je n'ai pas l'impression que toutes les jointures soient utiles puisque...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WHERE    t8.x503_matricule  = '$NumEntreprise' --ici je renseigne le numéro entreprise
    	AND     t7.dateexercice   >= to_date('$anneeRecherche/01/01','yyyy/mm/dd')
    	AND     t7.dateexercice   <= to_date('$anneeRecherche/12/31','yyyy/mm/dd')
    	AND     t2.statutpersonne IN ('ETAM' ,'ETAMA','ETAMB','IAC','IAC1','IAC2' ,'ING')
    Ne sont ici utilisées que :
    - t8 qui est en jointure avec t2 ;
    - t7 qui est en jointure avec t1 ;
    - t2 déjà citée qui est en jointure avec t1.

    Donc pour ça il ne faut que 4 tables : t1, t2, t7, t8.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT  DISTINCT numero_ent AS Matricule,
    Une bonne habitude à prendre : utiliser les alias partout dans la requête !
    Peut-on trouver pertinemment la colonne numero_ent dans une des 4 tables citées ci-dessus ?

    Et, chose bizarre, si numero_ent signifie numéro de l'entreprise, pourquoi est-ce ça que vous sélectionnez alors que vous cherchez les employés de l'entreprise $NumEntreprise ?

    Au passage, en SQL comme avec tout langage de programmation, indentez votre code !
    Voilà le début de votre requête indentée. C'est plus facile à lire et à comprendre, non ?
    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
    SELECT  DISTINCT numero_ent AS Matricule,
     
    FROM        Tablepaiement3 t1
    INNER JOIN        tablePaiement2 t7		ON        t1.idrefT7= t7.id
    INNER JOIN        archive2 t2		ON        t1.idrefT3 = t2.idrefT3
    	INNER JOIN        archive1 t3		ON        t2.idrefT3 = t3.id
    		INNER JOIN        entreprise t4		ON        t3.idrp=t4.id
    			INNER JOIN        personne t5		ON        t4.idrefT5=t5.idrefT5
    		INNER JOIN        campagneExercice1 t6		ON        t3.idreft6 = t6.id
    	INNER JOIN        entreprise t8		ON        t8.id=t2.c211_idEnt
    		INNER JOIN        tableRelationEnt t9		ON        t9.idrp_1 =t8.id	AND     t9.idrp_2 =t4.id
     
    WHERE    t8.x503_matricule  = '$NumEntreprise' --ici je renseigne le numéro entreprise
    	AND     t7.dateexercice   >= to_date('$anneeRecherche/01/01','yyyy/mm/dd')
    	AND     t7.dateexercice   <= to_date('$anneeRecherche/12/31','yyyy/mm/dd')
    	AND     t2.statutpersonne IN ('ETAM' ,'ETAMA','ETAMB','IAC','IAC1','IAC2' ,'ING')

  17. #37
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 934
    Points : 348
    Points
    348
    Par défaut
    petit edit :
    en faisant cette requete :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
     
    SELECT  DISTINCT numero_ent AS Matricule,
     
    FROM        Tablepaiement3 t1
    INNER JOIN        archive2 t2		ON        t1.idrefT3 = t2.idrefT3
    INNER JOIN        archive1 t3		ON        t2.idrefT3 = t3.id
    INNER JOIN        entreprise t4		ON        t3.idrp=t4.id
    INNER JOIN        personne t5		ON        t4.idrefT5=t5.idrefT5
    INNER JOIN        campagneExercice1 t6		ON        t3.idreft6 = t6.id
    INNER JOIN        tablePaiement2 t7		ON        t1.idrefT7= t7.id
    INNER JOIN        entreprise t8		ON        t8.id=t2.c211_idEnt
    INNER JOIN        tableRelationEnt t9		ON        t9.idrp_1 =t8.id	AND     t9.idrp_2 =t4.id
     
    AND     t7.dateexercice   >= to_date('$anneeRecherche/01/01','yyyy/mm/dd')
    AND     t7.dateexercice   <= to_date('$anneeRecherche/12/31','yyyy/mm/dd')
     
    and t9.date_JUSQUAU <> to_date('2999/12/31','yyyy/mm/dd') --rajout ici ,2999/12/31 veut dire que la personne se trouve toujours dans l'entreprise 1234 aujourd'hui
    --je n'ai pas rajouté la condtion de l'entreprise ici 
    AND     t2.statutpersonne IN ('ETAM' ,'ETAMA','ETAMB','IAC','IAC1','IAC2' ,'ING')
     
    and EXISTS
    (
    		SELECT  DISTINCT numero_ent AS Matricule,
    		FROM        Tablepaiement3 t1
    		INNER JOIN        archive2 t2		ON        t1.idrefT3 = t2.idrefT3
    		INNER JOIN        archive1 t3		ON        t2.idrefT3 = t3.id
    		INNER JOIN        entreprise t4		ON        t3.idrp=t4.id
    		INNER JOIN        personne t5		ON        t4.idrefT5=t5.idrefT5
    		INNER JOIN        campagneExercice1 t6		ON        t3.idreft6 = t6.id
    		INNER JOIN        tablePaiement2 t7		ON        t1.idrefT7= t7.id
    		INNER JOIN        entreprise t8		ON        t8.id=t2.c211_idEnt
    		INNER JOIN        tableRelationEnt t9		ON        t9.idrp_1 =t8.id	AND     t9.idrp_2 =t4.id
     
    		WHERE    t8.x503_matricule  = '$NumEntreprise'
    		AND     t7.dateexercice   >= to_date('$anneeRecherche/01/01','yyyy/mm/dd')
    		AND     t7.dateexercice   <= to_date('$anneeRecherche/12/31','yyyy/mm/dd')
    		AND     t7.dateexercice   <= t9.Date_JUSQUAU 
    			AND     t9.date_JUSQUAU>= to_date('$anneeRecherche/12/31','yyyy/mm/dd') 
     
    		AND     t2.statutpersonne IN ('ETAM' ,'ETAMA','ETAMB','IAC','IAC1','IAC2' ,'ING')
     
    )
    là j'obtiens pour une personne la liste des anciennes entreprise dans laquelle il se trouvait avant, je pense être pas loin il manque un petit je ne sais quoi pour avoir en plus la liste des entreprises actuels durant la période 2017^

  18. #38
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 934
    Points : 348
    Points
    348
    Par défaut

    Une bonne habitude à prendre : utiliser les alias partout dans la requête !
    J'y pense
    Peut-on trouver pertinemment la colonne numero_ent dans une des 4 tables citées ci-dessus ?
    le numéro d'entreprise correspond à t8.x503_matricule , je m'explique :
    t8.x503_matricule : correspond au numéro entreprise exemple : 12345
    t4.x503_matricule: correspond à un autre numéro, voila la distinction ... :s

    Et, chose bizarre, si numero_ent signifie numéro de l'entreprise, pourquoi est-ce ça que vous sélectionnez alors que vous cherchez les employés de l'entreprise $NumEntreprise ?
    justement je selectionne ça maintenant pour que la requête s'execute plus rapidement, mais une fois que ça sera bon, je pourrais rajouter aisément les autres champs initiale .
    Explication : je recherche les employés de l'entreprise $NumEntreprise (12345 entreprise actuel) mais sachant qu'une meme personne peut avoir travaillé dans une autre entreprise $NumEntreprise ( 4567)


    Au passage, en SQL comme avec tout langage de programmation, indentez votre code !
    oui j'y travaille aussi avec notepad++ , ce n'est pas ma requete, en fait c'est une requete que j'ai repris pour modification, au passage mon predecesseur n'a pas résolu le problème en plus d'un an mdr, mais je sais que l'on atteind presque le but

    Voilà le début de votre requête indentée. C'est plus facile à lire et à comprendre, non ?
    oui

    j'espere que ses explications pourront vous aider, en tout cas un grand merci !

  19. #39
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par android59
    Citation Envoyé par CinéPhil
    Peut-on trouver pertinemment la colonne numero_ent dans une des 4 tables citées ci-dessus ?
    le numéro d'entreprise correspond à t8.x503_matricule , je m'explique :
    t8.x503_matricule : correspond au numéro entreprise exemple : 12345
    t4.x503_matricule: correspond à un autre numéro, voila la distinction ... :s
    Ça ne répond pas à ma question !
    La colonne numero_ent vient de quelle table ?

    Citation Envoyé par android59
    Citation Envoyé par CinéPhil
    Et, chose bizarre, si numero_ent signifie numéro de l'entreprise, pourquoi est-ce ça que vous sélectionnez alors que vous cherchez les employés de l'entreprise $NumEntreprise ?
    justement je selectionne ça maintenant pour que la requête s'execute plus rapidement, mais une fois que ça sera bon, je pourrais rajouter aisément les autres champs initiale .
    Explication : je recherche les employés de l'entreprise $NumEntreprise (12345 entreprise actuel) mais sachant qu'une meme personne peut avoir travaillé dans une autre entreprise $NumEntreprise ( 4567)
    Donc on est bien d'accord que vous cherchez des employés mais que vous sélectionnez des entreprises... ou probablement une entreprise puisque la requête est restreinte à WHERE t8.x503_matricule = '$NumEntreprise'Vous voyez le souci ?

    Citation Envoyé par android59
    petit edit :
    en faisant cette requete :
    ...
    là j'obtiens pour une personne la liste des anciennes entreprise dans laquelle il se trouvait avant
    CE N'EST PAS CE QU'ON CHERCHE POUR LE MOMENT !

    Rappel de votre besoin :
    Dans quelles autres entreprises ont travaillé ceux qui ont travaillé dans l'entreprise E durant une période allant de DateDebut à DateFin.

    Décomposition du problème pour le résoudre :
    1) On cherche D'ABORD ceux qui ont travaillé dans l'entreprise E durant une certaine période.
    2) On restreint cette première sélection à ceux qui ont travaillé dans d'autres entreprises.
    3) On cherche quelles sont ces entreprises.

    C'est tellement embrouillé votre truc (on en est quand même à 39 messages ! ) qu'il ne faut pas brûler les étapes.
    Donc, concentrons-nous sur le 1 en écrivant la requête qui donnera les identifiants des employés ayant travaillé dans l'entreprise E durant une période P.
    ET SEULEMENT ÇA !

  20. #40
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 934
    Points : 348
    Points
    348
    Par défaut
    ok, donc

    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
    20
     
    SELECT  DISTINCT t5.identifiantpersonne
    --numero_ent AS Matricule,
    		FROM        Tablepaiement3 t1
    		INNER JOIN        archive2 t2		ON        t1.idrefT3 = t2.idrefT3
    		INNER JOIN        archive1 t3		ON        t2.idrefT3 = t3.id
    		INNER JOIN        entreprise t4		ON        t3.idrp=t4.id
    		INNER JOIN        personne t5		ON        t4.idrefT5=t5.idrefT5
    		INNER JOIN        campagneExercice1 t6		ON        t3.idreft6 = t6.id
    		INNER JOIN        tablePaiement2 t7		ON        t1.idrefT7= t7.id
    		INNER JOIN        entreprise t8		ON        t8.id=t2.c211_idEnt
    		INNER JOIN        tableRelationEnt t9		ON        t9.idrp_1 =t8.id	AND     t9.idrp_2 =t4.id
     
    		WHERE    t8.numero_ent= '1234'
    		AND     t7.dateexercice   >= to_date('2017/01/01','yyyy/mm/dd')
    		AND     t7.dateexercice   <= to_date('2017/12/31','yyyy/mm/dd')
    		AND     t7.dateexercice   <= t9.Date_JUSQUAU 
    			AND     t9.date_JUSQUAU>= to_date('2017/12/31','yyyy/mm/dd') 
     
    		AND     t2.statutpersonne IN ('ETAM' ,'ETAMA','ETAMB','IAC','IAC1','IAC2' ,'ING')
    donc là j'ai que les identifiants des personnes dans l'entreprise 1234 , durant l'année 2017

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [Scanner] Pb avec la récupération du résultat...
    Par Jutige dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 17/07/2006, 16h19
  2. récupération de résultat
    Par Monstros Velu dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/04/2006, 10h12
  3. Réponses: 2
    Dernier message: 29/03/2006, 09h38
  4. Récupération du résultat d'une commande shell
    Par klu dans le forum Langage
    Réponses: 8
    Dernier message: 16/02/2006, 23h34
  5. [SQL SERVER 2000]Récupération du résultat d'un select.
    Par gwadakillah dans le forum Langage SQL
    Réponses: 5
    Dernier message: 24/01/2006, 13h35

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