OVH Cloud OVH Cloud

Analyse croisée

2 réponses
Avatar
Gilbert
Bonjour,

J'ai une table Planning dans laquelle chaque enregistrement (un
enregistrement par stagiaire et par matière suivie) a une valeur en fonction
des présences des stagiaires:
Lundi matin 1
Lundi après-midi 2
Mardi matin 4
Mardi après-midi 8
....
Vendredi après-midi 512
Par exemple : une personne fait des maths les lundi matin, mardi après-midi
et jeudi matin la valeur sera de 1+8+64=73 et du français les lundi am et
jeudi am : 2+128=130

Je veux faire une requête qui me donne un tableau avec les matières en
entête de ligne, les scéances en entête de colonnes et les noms des
stagiaires dans le tableau.

Je n'arrive pas à faire une requête qui me fasse ça directement.
Si j'utilise la fonction SWITCH dans le PIVOT, un même nom n'apparait qu'une
fois dans mon tableau. Dans l'exemple ci-dessus, la personne est dans la
colonne lundi matin, mais pas dans mardi après-midi, ni jeudi matin.

J'ai essayé de faire une requête pour chaque scéance :
TRANSFORM First(Tbl_Identite.NomIdentite) AS PremierDeNomIdentite
SELECT Tbl_Site_Formation.Intitule, Tbl_Matieres.Intitule,
Tbl_Planning.ValPlanning
FROM Tbl_Site_Formation INNER JOIN (Tbl_Matieres INNER JOIN ((Tbl_Identite
INNER JOIN Tbl_Infos_Formation ON Tbl_Identite.NumID =
Tbl_Infos_Formation.NumIdentite) INNER JOIN Tbl_Planning ON
Tbl_Infos_Formation.NumID = Tbl_Planning.IdFormation) ON Tbl_Matieres.NumID
= Tbl_Planning.IdMatiere) ON (Tbl_Site_Formation.NumID =
Tbl_Planning.IdSite) AND (Tbl_Site_Formation.NumID =
Tbl_Infos_Formation.SiteFormation)
WHERE (((fctTestPlanning([valplanning],512))=True))
GROUP BY Tbl_Site_Formation.Intitule, Tbl_Matieres.Intitule,
Tbl_Planning.ValPlanning, Tbl_Infos_Formation.NumID
PIVOT (((fctTestPlanning([valplanning],512))));
mais c'est un peu lourd et surtout, je n'arrive pas ensuite à tout
regrouper.

Si quelqu'un a une idée, je l'en remercie d'avance

Gilbert

2 réponses

Avatar
Michel Walsh
Salut,


Si je comprend bien, d'un seul enregistrement ayant, disons, la valuer
73, il faut faire "comme si" il y avait trois enregistrements, avec les
valeurs 1, 8 et 64. Cette "explosion" ( passer de 1 enrengistrement à trois)
variable ( pas toujours 3, mais dépendant des valeurs) indique qu'il faut
une jointure.

J'imagine qu'on possède une table "codes":

Codes
section valeur
lundi matin 1
lundi PM 2
mardi AM 4
mardi PM 8
mercredi AM 16
mercredi PM 32
jeudi AM 64
jeudi PM 128
vendredi AM 256
vendredi PM 512





Et ta table "x1"

X1
qui code
103 16
101 73
102 130







Alors:



TRANSFORM LAST(Qui)
SELECT Qui
FROM x1 INNER JOIN codes
ON MyAND(x1.code, codes.valeur)
GROUP BY Qui
PIVOT section

fournit:


Query11
qui jeudi AM jeudi PM lundi matin lundi PM mardi PM mercredi AM
101 101
101
101

102
102
102


103




103



On pourrait avoir toutes les sessions en ajoutant une liste IN après le
pivot.



J'utilise:
--------------
Public Function MyAnd(A As Long, B As Long) As Boolean
MyAnd = CBool(A And B)
End Function
---------------


En principe, Jet 4.0 BAND (binary and) ferait l'affaire, et le fait,
mais il faut utiliser ADO. Le designer de requête utilise DAO et n'aime pas
du tout BAND. Donc'j'ai passé par une fonction VBA en lieu et place.


Je ne vois pas les regroupements (GROUP) désirés, mais j'imagine que ce qui
précède peut éventuellement fournir des idées pour progresser...

Vanderghast, Access MVP




"Gilbert" wrote in message
news:
Bonjour,

J'ai une table Planning dans laquelle chaque enregistrement (un
enregistrement par stagiaire et par matière suivie) a une valeur en
fonction
des présences des stagiaires:
Lundi matin 1
Lundi après-midi 2
Mardi matin 4
Mardi après-midi 8
....
Vendredi après-midi 512
Par exemple : une personne fait des maths les lundi matin, mardi
après-midi
et jeudi matin la valeur sera de 1+8+64s et du français les lundi am et
jeudi am : 2+1280

Je veux faire une requête qui me donne un tableau avec les matières en
entête de ligne, les scéances en entête de colonnes et les noms des
stagiaires dans le tableau.

Je n'arrive pas à faire une requête qui me fasse ça directement.
Si j'utilise la fonction SWITCH dans le PIVOT, un même nom n'apparait
qu'une
fois dans mon tableau. Dans l'exemple ci-dessus, la personne est dans la
colonne lundi matin, mais pas dans mardi après-midi, ni jeudi matin.

J'ai essayé de faire une requête pour chaque scéance :
TRANSFORM First(Tbl_Identite.NomIdentite) AS PremierDeNomIdentite
SELECT Tbl_Site_Formation.Intitule, Tbl_Matieres.Intitule,
Tbl_Planning.ValPlanning
FROM Tbl_Site_Formation INNER JOIN (Tbl_Matieres INNER JOIN ((Tbl_Identite
INNER JOIN Tbl_Infos_Formation ON Tbl_Identite.NumID > Tbl_Infos_Formation.NumIdentite) INNER JOIN Tbl_Planning ON
Tbl_Infos_Formation.NumID = Tbl_Planning.IdFormation) ON
Tbl_Matieres.NumID
= Tbl_Planning.IdMatiere) ON (Tbl_Site_Formation.NumID > Tbl_Planning.IdSite) AND (Tbl_Site_Formation.NumID > Tbl_Infos_Formation.SiteFormation)
WHERE (((fctTestPlanning([valplanning],512))=True))
GROUP BY Tbl_Site_Formation.Intitule, Tbl_Matieres.Intitule,
Tbl_Planning.ValPlanning, Tbl_Infos_Formation.NumID
PIVOT (((fctTestPlanning([valplanning],512))));
mais c'est un peu lourd et surtout, je n'arrive pas ensuite à tout
regrouper.

Si quelqu'un a une idée, je l'en remercie d'avance

Gilbert




Avatar
Gilbert
Merci beaucoup, je vais tester dès que possible.

--
Gilbert


"Michel Walsh" a écrit dans le message
de news:
Salut,


Si je comprend bien, d'un seul enregistrement ayant, disons, la valuer
73, il faut faire "comme si" il y avait trois enregistrements, avec les
valeurs 1, 8 et 64. Cette "explosion" ( passer de 1 enrengistrement à
trois) variable ( pas toujours 3, mais dépendant des valeurs) indique
qu'il faut une jointure.

J'imagine qu'on possède une table "codes":

Codes
section valeur
lundi matin 1
lundi PM 2
mardi AM 4
mardi PM 8
mercredi AM 16
mercredi PM 32
jeudi AM 64
jeudi PM 128
vendredi AM 256
vendredi PM 512





Et ta table "x1"

X1
qui code
103 16
101 73
102 130







Alors:



TRANSFORM LAST(Qui)
SELECT Qui
FROM x1 INNER JOIN codes
ON MyAND(x1.code, codes.valeur)
GROUP BY Qui
PIVOT section

fournit:


Query11
qui jeudi AM jeudi PM lundi matin lundi PM mardi PM mercredi AM
101 101
101
101

102
102
102


103




103



On pourrait avoir toutes les sessions en ajoutant une liste IN après le
pivot.



J'utilise:
--------------
Public Function MyAnd(A As Long, B As Long) As Boolean
MyAnd = CBool(A And B)
End Function
---------------


En principe, Jet 4.0 BAND (binary and) ferait l'affaire, et le fait,
mais il faut utiliser ADO. Le designer de requête utilise DAO et n'aime
pas du tout BAND. Donc'j'ai passé par une fonction VBA en lieu et place.


Je ne vois pas les regroupements (GROUP) désirés, mais j'imagine que ce
qui précède peut éventuellement fournir des idées pour progresser...

Vanderghast, Access MVP




"Gilbert" wrote in message
news:
Bonjour,

J'ai une table Planning dans laquelle chaque enregistrement (un
enregistrement par stagiaire et par matière suivie) a une valeur en
fonction
des présences des stagiaires:
Lundi matin 1
Lundi après-midi 2
Mardi matin 4
Mardi après-midi 8
....
Vendredi après-midi 512
Par exemple : une personne fait des maths les lundi matin, mardi
après-midi
et jeudi matin la valeur sera de 1+8+64s et du français les lundi am et
jeudi am : 2+1280

Je veux faire une requête qui me donne un tableau avec les matières en
entête de ligne, les scéances en entête de colonnes et les noms des
stagiaires dans le tableau.

Je n'arrive pas à faire une requête qui me fasse ça directement.
Si j'utilise la fonction SWITCH dans le PIVOT, un même nom n'apparait
qu'une
fois dans mon tableau. Dans l'exemple ci-dessus, la personne est dans la
colonne lundi matin, mais pas dans mardi après-midi, ni jeudi matin.

J'ai essayé de faire une requête pour chaque scéance :
TRANSFORM First(Tbl_Identite.NomIdentite) AS PremierDeNomIdentite
SELECT Tbl_Site_Formation.Intitule, Tbl_Matieres.Intitule,
Tbl_Planning.ValPlanning
FROM Tbl_Site_Formation INNER JOIN (Tbl_Matieres INNER JOIN
((Tbl_Identite
INNER JOIN Tbl_Infos_Formation ON Tbl_Identite.NumID >> Tbl_Infos_Formation.NumIdentite) INNER JOIN Tbl_Planning ON
Tbl_Infos_Formation.NumID = Tbl_Planning.IdFormation) ON
Tbl_Matieres.NumID
= Tbl_Planning.IdMatiere) ON (Tbl_Site_Formation.NumID >> Tbl_Planning.IdSite) AND (Tbl_Site_Formation.NumID >> Tbl_Infos_Formation.SiteFormation)
WHERE (((fctTestPlanning([valplanning],512))=True))
GROUP BY Tbl_Site_Formation.Intitule, Tbl_Matieres.Intitule,
Tbl_Planning.ValPlanning, Tbl_Infos_Formation.NumID
PIVOT (((fctTestPlanning([valplanning],512))));
mais c'est un peu lourd et surtout, je n'arrive pas ensuite à tout
regrouper.

Si quelqu'un a une idée, je l'en remercie d'avance

Gilbert