Regrouper des données en ligne de plusieurs tables
4 réponses
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
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...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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;
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
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;
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
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;
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
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" !!!
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
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
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
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
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
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