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

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

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

9 réponses

Avatar
db
Le 13/05/2010 19:30, Touti a écrit :
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




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
Avatar
Touti
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





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
Avatar
db
Le 13/05/2010 21:47, Touti a écrit :
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




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



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
Avatar
Touti
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



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
Avatar
db
Le 13/05/2010 23:22, Touti a écrit :

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 ??




Cumuler les requêtes, oui, ou utiliser d'autres techniques, comme les
recordsets : tout dépend des traitements que vous avez à faire.


db
Avatar
Michel__D
Bonjour,

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




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




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;
Avatar
Touti
Bonjour Db et tous les autres,

Cumuler les requêtes, oui, ou utiliser d'autres techniques, comme les
recordsets : tout dépend des traitements que vous avez à faire.



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
Avatar
Touti
Bonjour,

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;



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
Avatar
Michel__D
Re,

Touti a écrit :
Bonjour,


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;




j'ai beau manipuler ton contenu, j'ai toujours une erreur de syntaxe..

Merci

GuY




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;