Regrouper des données en ligne de plusieurs tables
Le
toutenn

Bonjour,
Voici un petit casse tête pour ce week-end mais qui m'aiderait
franchement
J'ai eu beau faire des essais de requetes d'analyse croisée et de
multiplcation de table, je n'aboutis pas au résultat souhaité. Je vous
présente mon souhait :
Je dispose de 2 tables : Stagiaire et Contrat
Stagiaire :
Numstg NomStg
1 Dupont
2 Durant
3 Lacaze
4 Toto
5 Latour
6 Lepont
7 Leroy
Contrat :
Numctt Numstg DEntrée Dsortie
20 1 06/09/11 06/01/12
21 1 07/01/12 04/05/12
22 1 05/05/12 31/07/12
23 2 05/09/11 06/01/11
24 2 07/01/12 04/05/12
25 2 05/05/12
26 3 01/05/12
27 4 23/01/12 13/04/12
28 5 05/09/11 06/01/12
29 6 05/09/11 06/01/12
30 6 07/01/12 04/05/12
31 6 05/05/12
32 7 05/09/11 06/01/12
33 7 07/01/12 04/05/12
34 7 05/05/12
Il me faudrait obtenir ce type de regroupement où par stagiaire je
retrouverai toutes les dates(entrée-sortie) des contrats en ligne :
Nomstg Dentrée1 Dsortie1 Dentrée2 Dsortie2 Dentrée3 Dsortie3
Dupont 06/09/11 06/01/12 07/01/12 04/05/12 05/05/12 31/07/12
Durant 05/09/11 06/01/11 07/01/12 04/05/12 05/05/12
Lacaze 01/05/12
Toto 23/01/12 13/04/12
Latour 05/09/11 06/01/12
Lepont 05/09/11 06/01/12 07/01/12 04/05/12 05/05/12
Leroy 05/09/11 06/01/12 07/01/12 04/05/12 05/05/12
Est-ce vraiment réalisable avec une simple requete ou dois-je passer par le
VBA ??? Avis aux spécialistes
Merci !!
Guy
Voici un petit casse tête pour ce week-end mais qui m'aiderait
franchement
J'ai eu beau faire des essais de requetes d'analyse croisée et de
multiplcation de table, je n'aboutis pas au résultat souhaité. Je vous
présente mon souhait :
Je dispose de 2 tables : Stagiaire et Contrat
Stagiaire :
Numstg NomStg
1 Dupont
2 Durant
3 Lacaze
4 Toto
5 Latour
6 Lepont
7 Leroy
Contrat :
Numctt Numstg DEntrée Dsortie
20 1 06/09/11 06/01/12
21 1 07/01/12 04/05/12
22 1 05/05/12 31/07/12
23 2 05/09/11 06/01/11
24 2 07/01/12 04/05/12
25 2 05/05/12
26 3 01/05/12
27 4 23/01/12 13/04/12
28 5 05/09/11 06/01/12
29 6 05/09/11 06/01/12
30 6 07/01/12 04/05/12
31 6 05/05/12
32 7 05/09/11 06/01/12
33 7 07/01/12 04/05/12
34 7 05/05/12
Il me faudrait obtenir ce type de regroupement où par stagiaire je
retrouverai toutes les dates(entrée-sortie) des contrats en ligne :
Nomstg Dentrée1 Dsortie1 Dentrée2 Dsortie2 Dentrée3 Dsortie3
Dupont 06/09/11 06/01/12 07/01/12 04/05/12 05/05/12 31/07/12
Durant 05/09/11 06/01/11 07/01/12 04/05/12 05/05/12
Lacaze 01/05/12
Toto 23/01/12 13/04/12
Latour 05/09/11 06/01/12
Lepont 05/09/11 06/01/12 07/01/12 04/05/12 05/05/12
Leroy 05/09/11 06/01/12 07/01/12 04/05/12 05/05/12
Est-ce vraiment réalisable avec une simple requete ou dois-je passer par le
VBA ??? Avis aux spécialistes
Merci !!
Guy
toutenn a écrit :
Ce ne doit pas être possible avec une simple requête mais avec 2 requêtes c'est possible :
Voici la 1ère requête préparatoire nommé : Req1
SELECT A.Numctt, A.Numstg, First(A.Dentrée) AS ChDate, "Dentrée" AS ChPivot, Count(B.Numstg) AS Compte
FROM Contrat AS A INNER JOIN Contrat AS B ON (A.Numstg=B.Numstg) AND (A.Numctt>=B.Numctt)
WHERE A.Dentrée Is Not Null
GROUP BY A.Numctt, A.Numstg
UNION
SELECT A.Numctt, A.Numstg, First(A.Dsortie) AS ChDate, "Dsortie" AS ChPivot, Count(B.Numstg) AS Compte
FROM Contrat AS A INNER JOIN Contrat AS B ON (A.Numstg=B.Numstg) AND (A.Numctt>=B.Numctt)
WHERE A.Dsortie Is Not Null
GROUP BY A.Numctt, A.Numstg;
Et la requête finale :
TRANSFORM First(R.ChDate)
SELECT [T].Nomstg
FROM Req1 AS R INNER JOIN Stagiaire AS T ON R.Numstg=[T].Numstg
GROUP BY [T].Nomstg
PIVOT R.Compte & R.ChPivot;
Tout bonnement formidable !!!
Un grand merci, tu maîtrises vraiment la "Chose" !!!
Bon week
Je rencontre un peu soucis quand même, c'est dans l'ordre des dates.
Bizarrement, l'instruction first renvoie parfois un ordre éronné...
Exemple avec le résultat d'une jointure des tables contrat et stagiaire
numstg Nomstg DEntrée Dsortie
68 Dupont 06/09/2011 06/01/2012
68 Dupont 07/01/2012 04/05/2012
68 Dupont 05/05/2012
69 Durant 05/09/2011 06/01/2011
69 Durant 07/01/2012 04/05/2012
69 Durant 05/05/2012
71 Toto 05/09/2011 06/01/2012
71 Toto 07/01/2012 04/05/2012
71 Toto 05/05/2012
et le regroupement en Fisrt sur le champ Dentrée, le résultat est :
PremierDenumstg Nomstg PremierDeDEntrée PremierDeDsortie
68 Dupont 05/05/2012
69 Durant 05/05/2012
71 Toto 05/09/2011 06/01/2012
Ce qui ne correspond pas à la réalité pour Dupont et Durant mais correct
pour toto. Bizarre bizarre
en changeant First en Min, cela devient correct
PremierDenumstg Nomstg MinDeDEntrée MinDeDsortie
68 Dupont 06/09/2011 06/01/2012
69 Durant 05/09/2011 06/01/2011
71 Toto 05/09/2011 06/01/2012
J'ai donc modifié ta première requete d'Union (Min à la place de First)
"action" est un critère que j'ai du rajouter pour mieux filtrer les
enregistrements
SELECT A.numctc, A.Numstg, min(A.Dentrée) AS ChDate, "Dentrée" AS ChPivot,
Count(B.Numstg) AS Compte
FROM Contrat AS A INNER JOIN Contrat AS B ON (A.Numstg=B.Numstg) AND
(A.numctc>=B.numctc)
WHERE A.Dentrée Is Not Null and a.action=2 and b.action=2
GROUP BY A.No_cnt, A.Pat_cnt
UNION SELECT A.No_cnt, A.Pat_cnt, min(A.Dsortie) AS ChDate, "Dsortie" AS
ChPivot, Count(B.Numstg) AS Compte
FROM Contrat AS A INNER JOIN Contrat AS B ON (A.Numstg=B.Numstg) AND
(A.numctc>=B.numctc)
WHERE A.Dsortie Is Not Null and a.action=2 and b.action=2
GROUP BY A.No_cnt, A.Pat_cnt;
mais le comptage ne correspond toujours pas à la réalité: exemple :
numctc Numstg ChDate ChPivot Compte
206 68 06/01/2012 Dsortie 2
80 68 07/01/2012 Dentrée 1
80 68 04/05/2012 Dsortie 1
208 68 05/05/2012 Dentrée 3
206 68 06/09/2011 Dentrée 2
Dentrée 1, devrait être le 06/09/2011
Dentrée 2, le 07/01/2012
Dentrée 3, le 05/05/2012
J'espère avoir été explicite. Merci
J'ai modifié les lignes From en :
FROM Contrat AS A INNER JOIN Contrat AS B ON (A.Numstg=B.Numstg) AND
(A.Numctt>=B.Numctt)
Encore un grand merci, j'ai pu comprendre le fonctionnement de la requete
UNION
Guy