Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Regrouper des données en ligne de plusieurs tables

4 réponses
Avatar
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

4 réponses

Avatar
Michel__D
Bonjour,

toutenn a écrit :
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...



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;
Avatar
toutenn
Bonjour

Ce ne doit pas être possible avec une simple requête mais avec 2 requêtes
c'est possible :



Tout bonnement formidable !!!

Un grand merci, tu maîtrises vraiment la "Chose" !!!

Bon week
Avatar
toutenn
Re bonjour,

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
Avatar
toutenn
Problème résolu !!

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)
FROM Contrat AS A INNER JOIN Contrat AS B ON (A.Numstg=B.Numstg) AND
(A.Dentrée>=B.Dentrée)





Encore un grand merci, j'ai pu comprendre le fonctionnement de la requete
UNION

Guy