un petit casse tête : regroupement avec paramètres
Le
Touti

Bonsoir,
J'ai beau retourner le problème dans tous les sens : Je me heurte à un
soucis de regroupement
Voilà : J'ai deux tables Utilisateurs et Démarches (liées), et je recherche
à dénombrer le nombre de démarches pour une période donnée (exemple du
01/01/2009 au 31/12/2009)
Utilisateurs
* Num
* Nom
* Prénom
10,dupont,pierre
20,durant,monique
Démarches
* Num
* date
10,01/03/2008
10,01/02/2009
10,01/04/2009
10,01/05/2009
10,01/01/2010
Ici avec l'exemple, j'ai 2 utilisateurs : 1 a réalisé plusieurs démarches,
l'autre pas.
Grâce à deux requêtes de regroupement différentes, j'arrive à obtenir le
résultat :
1er cas
dupont,5
durant,0
2ème cas
dupont,3
Comment pourrais-je réaliser une requête pour obtenir la compilation des
deux ???
dupont,3
durant,0
J'ai essayé d'intégrer la fonction Count, Dcount, sans succés.
Merci pour votre aide (même en Sql pas de VBA)
GuY
__________ Information provenant d'ESET NOD32 Antivirus, version de la base des signatures de virus 5113 (20100513) __________
Le message a été vérifié par ESET NOD32 Antivirus.
http://www.eset.com
J'ai beau retourner le problème dans tous les sens : Je me heurte à un
soucis de regroupement
Voilà : J'ai deux tables Utilisateurs et Démarches (liées), et je recherche
à dénombrer le nombre de démarches pour une période donnée (exemple du
01/01/2009 au 31/12/2009)
Utilisateurs
* Num
* Nom
* Prénom
10,dupont,pierre
20,durant,monique
Démarches
* Num
* date
10,01/03/2008
10,01/02/2009
10,01/04/2009
10,01/05/2009
10,01/01/2010
Ici avec l'exemple, j'ai 2 utilisateurs : 1 a réalisé plusieurs démarches,
l'autre pas.
Grâce à deux requêtes de regroupement différentes, j'arrive à obtenir le
résultat :
1er cas
dupont,5
durant,0
2ème cas
dupont,3
Comment pourrais-je réaliser une requête pour obtenir la compilation des
deux ???
dupont,3
durant,0
J'ai essayé d'intégrer la fonction Count, Dcount, sans succés.
Merci pour votre aide (même en Sql pas de VBA)
GuY
__________ Information provenant d'ESET NOD32 Antivirus, version de la base des signatures de virus 5113 (20100513) __________
Le message a été vérifié par ESET NOD32 Antivirus.
http://www.eset.com
Essayez cette requête (non testée) :
SELECT nom, count(num)
from utilisateurs left join Démarches on Démarches.num=Utilisateurs.num
where [date] between #1/1/2009# and #12/31/2009#
group by nom
db
On avance : Le comptage se réalise bien mais le nom de la personne qui n'a
pas eu de démarche n'apparait pas avec le comptage
Merci
GuY
__________ Information provenant d'ESET NOD32 Antivirus, version de la base des signatures de virus 5113 (20100513) __________
Le message a été vérifié par ESET NOD32 Antivirus.
http://www.eset.com
Effectivement, le fait de mettre le critère sur la table en jointure
externe annule l'effet voulu. Je ne vois que cette solution :
Créer une première requête avec le critère de date (Démarches2009):
Select * from Démarches
where [date] between #1/1/2009# and #12/31/2009#
puis la requête finale :
SELECT nom, count(Démarches2009.num)
from utilisateurs left join Démarches2009 on
Démarches2009.num=Utilisateurs.num
group by nom
db
Merci de ta réponse
Oui je suis bien coincé, déjà que la table utilisateur (j'avais simplifié
l'exemple) vient déjà d'une autre requête paramétrée, ca commence à
compliquer les choses(augmentation des objets,...)
Par contre en VBA, puis-je cumuler les requêtes ??
GuY
__________ Information provenant d'ESET NOD32 Antivirus, version de la base des signatures de virus 5113 (20100513) __________
Le message a été vérifié par ESET NOD32 Antivirus.
http://www.eset.com
Cumuler les requêtes, oui, ou utiliser d'autres techniques, comme les
recordsets : tout dépend des traitements que vous avez à faire.
db
Touti a écrit :
Essaye avec ce SQL
SELECT T.nom, Sum(Nz(R.compte,0)) AS Valeur
FROM utilisateurs LEFT JOIN (
select S.num, Count(S.date) as compte from Démarches as S where
Year(S.date) 09 group by S.num) AS R
GROUP BY T.nom;
Vu la structure de la base de données (je peux pas la modifier) je suis
obligé, comme tu l'avais signalé, de décomposer les actions et je suis donc
passé au VBA pour atteindre mon objectif.
Pour le cas présent, je parcours différentes étapes pour arriver à la
synthèse des informations (par exemple dénombrer les démarches
d'utilisateurs).
1) Dans un formulaire, 2 zones de texte et un bouton me permet de filtrer
les utilisateurs sur une période d'analyse qui s'affiche dans une grille. Je
rajoute un champ Select (case à cocher pour affiner la sélection des
utilisateurs)
//code //
* création d'une table Tab_base avec paramètres : CurrentDb.Execute sql
(elle me permet de mémoriser tous les utilisateurs pour toutes les autres
actions de synthèse)
* Ajout du champ Select dans la table : CreateField("select", dbBoolean)
* Affichage de la table dans la grille : gril.SourceObject =
"Table.Tab_base"
2) Phase de synthèse : Un bouton "démarche" du même formulaire lance la
synthèse. La table Base est liée à la table des démarches.
//code//
* Création d'une requête intermédiaire qui permet de filtrer les démarches
sur la même période selon aussi les personnes sélectionnées
* Création d'une requête de regroupement (req_final) qui permet de créer la
synthèse à partir des infos de la requête intermédiaire et la table de Base
* Création d'une table Final qui contiendra toutes les synthèses
* Ajout d'un champ dans la Table Final
* Mise a jour de ce champ à partir des infos de la requête de regroupement
==>>> Et c'est là que ca pause problème, j'utilise une technique trouvée
sur le net mais le temps de traitement est très long et plante si je
sélectionne trop de personnes (la base est sur un réseau).
//Code//
sql = "UPDATE Tab_final SET Tab_final.[nbr dém_emp] = DSum(""[nbr
dem_emp]"",""req_final"",""[req_final.numero] = "" & [tab_final].[numero]);"
CurrentDb.Execute sql
Surtout lorsque dans certaines synthèses, j'ai un nombre important de champ
à mettre à jour
Set db = CurrentDb
Set td = db.TableDefs("Tab_final")
Screen.MousePointer = 11
Dim nomfield As String
For i = 4 To qd.Fields.Count
nomfield = qd.Fields(i).Name
Set f = td.CreateField(nomfield, dbLong)
With td.Fields
.Append f
.Refresh
End With
CreateField = True
DoEvents
sql = "UPDATE Tab_final SET Tab_final.[" & nomfield & "] = DSum(""["
& nomfield & "]"",""req_final"",""[req_final.numero] = "" &
[tab_final].[numero]);"
CurrentDb.Execute sql
DoEvents
Next i
Screen.MousePointer = 0
Ma question est : Y a t-il une autre possibilité de placer les données d'une
requête dans une table ????
Merci et bon Week-end
GuY
__________ Information provenant d'ESET NOD32 Antivirus, version de la base des signatures de virus 5115 (20100514) __________
Le message a été vérifié par ESET NOD32 Antivirus.
http://www.eset.com
j'ai beau manipuler ton contenu, j'ai toujours une erreur de syntaxe..
Merci
GuY
__________ Information provenant d'ESET NOD32 Antivirus, version de la base des signatures de virus 5116 (20100515) __________
Le message a été vérifié par ESET NOD32 Antivirus.
http://www.eset.com
Touti a écrit :
Et oui ce SQL comportait plusieurs erreurs, cela devrait aller mieux
avec ceci :
SELECT T.Nom, Sum(Nz(R.Compte,0)) AS Valeur
FROM utilisateurs AS T LEFT JOIN
(SELECT S.Num, Count(S.DateEnr) AS Compte FROM Démarches AS S WHERE
Year(S.DateEnr) 09 GROUP BY S.Num) AS R
ON T.Num=R.Num
GROUP BY T.nom;