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

Problème avec doublons dans requête

5 réponses
Avatar
Norm
Bonjour,

Une requête extrait des données d'une table sous-jacente. Cette requête
n'utilise que 3 champs de la table source soit : NoID - NoPer et Service.
Les champs NoID et NoPer sont de type numérique et le champ Service de type
texte dans la table source.

Résultat recherché :
Sachant que le nom d'un même Service peut être inscrit plusieurs fois pour
le même NoID et/ou pour le même NoPer j'aimerais pouvoir compter, à l'aide
de la requête, combien de fois le nom d'un Service a été inscrit pour une
même période (NoPer) et pour un même NoID mais en éliminant les doublons.

Actuellement, j'arrive à compter le nombre de fois où le Service "Urgence"
(par exemple) a été inscrit mais, évidemment, des doublons viennent fausser
le résultat. Par exemple, si le Service "Urgence" a été inscrit 3 fois à la
période 1 (NoPer) pour le NoID 4, j'aimerais que la requête ne considère
cela que comme 1 seule fois, pour cette période et ce NoID.

J'espère que j'ai su exposer clairement le problème et merci à qui pourrait
m'éclairer.
Norm

5 réponses

Avatar
Eric
Bonjour,

En supposant que tu ne souhaites voir que le service et le nb de fois
qu'il a été 'utilisé' sans doublons sur le noid et le noper, essaies ceci :

SELECT service, count(service) as nb
FROM (SELECT DISTINCT service, noid, noper
FROM LaTable)
GROUP BY service;


S'il faut afficher aussi le noid et le noper alors celle-là:

SELECT service, noid, noper, count(service) AS nb
FROM (SELECT DISTINCT service, noid, noper
FROM LaTable)
GROUP BY service, noid, noper;

Adapter le nom de la table et à copier dans la fenêtre SQL de la requête
(Menu Affichage|Mode SQL)

Bonjour,

Une requête extrait des données d'une table sous-jacente. Cette requête
n'utilise que 3 champs de la table source soit : NoID - NoPer et Service.
Les champs NoID et NoPer sont de type numérique et le champ Service de type
texte dans la table source.

Résultat recherché :
Sachant que le nom d'un même Service peut être inscrit plusieurs fois pour
le même NoID et/ou pour le même NoPer j'aimerais pouvoir compter, à l'aide
de la requête, combien de fois le nom d'un Service a été inscrit pour une
même période (NoPer) et pour un même NoID mais en éliminant les doublons.

Actuellement, j'arrive à compter le nombre de fois où le Service "Urgence"
(par exemple) a été inscrit mais, évidemment, des doublons viennent fausser
le résultat. Par exemple, si le Service "Urgence" a été inscrit 3 fois à la
période 1 (NoPer) pour le NoID 4, j'aimerais que la requête ne considère
cela que comme 1 seule fois, pour cette période et ce NoID.

J'espère que j'ai su exposer clairement le problème et merci à qui pourrait
m'éclairer.
Norm




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Norm
Bonjour Éric,

Merci pour cette réponse. Cependant, les 2 options que tu m'as proposées ne
donnent pas encore tout à fait le résultat recherché. J'ai probablement pas
expliqué (c'est pas toujours facile...) clairement le but recherché. De
plus, afin de simplifier (je n'aurais pas dû faire cela, peut-être...)
l'écriture du message, j'avais aussi "simplfier" les noms originaux des
champs utilisés. Enfin, en étudiant mes besoins, j'ai constaté qu'un
nouveau champ paramétré (année) doit être inséré dans la requête.

Bon... à la lumière de tes explications et de mes tests précédents avec
cette requête, j'en suis actuellement au code SQL (requête) ci-dessous. La
requête actuelle s'exécute correctement. Cependant des doublons (compter
plusieurs fois) sont encore présents.

Ce que je recherche encore c'est :
Si le No Identité 200 a été inscrit 3 fois à la Période 2 pour le Service
"Urgence" (donc 3 fois le mot "Urgence" pour le même No Id et la même
Période) j'aimerais que la requête ne compte cela que pour 1 seule fois.

Voici, ci-dessous, le code actuel de la requête :
SELECT DISTINCT HEURES.Année, HEURES.[No Identité], HEURES.[No Période],
HEURES.Services, Count(HEURES.Services) AS CompteService
FROM HEURES
GROUP BY HEURES.Année, HEURES.[No Identité], HEURES.[No Période],
HEURES.Services
HAVING (((HEURES.Année)=[Inscrire l'année]))
ORDER BY HEURES.[No Identité], HEURES.[No Période];

Merci encore si tu peux me proposer une solution.
Norm
Avatar
Eric
re,

Attention : Année est un mot réservé pour Access, code plutot
AnneeIntervention ou autrement pour que ca soit plus explicite.
De même éviter les espaces autant que faire se peut dans les noms de
champs et les accents tant qu'on y est. ;-)

En reprenant les noms de tes champs, essaies ceci :

SELECT année, [no identité], [no période], services,
count(services) AS nb
FROM (SELECT DISTINCT services, [no identité], [no période], année
FROM Heures
WHERE Année=[Inscrire l'année])
GROUP BY services, [no identité], [no période], année
ORDER BY [no identité],[no période];



Bonjour Éric,

Merci pour cette réponse. Cependant, les 2 options que tu m'as proposées ne
donnent pas encore tout à fait le résultat recherché. J'ai probablement pas
expliqué (c'est pas toujours facile...) clairement le but recherché. De
plus, afin de simplifier (je n'aurais pas dû faire cela, peut-être...)
l'écriture du message, j'avais aussi "simplfier" les noms originaux des
champs utilisés. Enfin, en étudiant mes besoins, j'ai constaté qu'un
nouveau champ paramétré (année) doit être inséré dans la requête.

Bon... à la lumière de tes explications et de mes tests précédents avec
cette requête, j'en suis actuellement au code SQL (requête) ci-dessous. La
requête actuelle s'exécute correctement. Cependant des doublons (compter
plusieurs fois) sont encore présents.

Ce que je recherche encore c'est :
Si le No Identité 200 a été inscrit 3 fois à la Période 2 pour le Service
"Urgence" (donc 3 fois le mot "Urgence" pour le même No Id et la même
Période) j'aimerais que la requête ne compte cela que pour 1 seule fois.

Voici, ci-dessous, le code actuel de la requête :
SELECT DISTINCT HEURES.Année, HEURES.[No Identité], HEURES.[No Période],
HEURES.Services, Count(HEURES.Services) AS CompteService
FROM HEURES
GROUP BY HEURES.Année, HEURES.[No Identité], HEURES.[No Période],
HEURES.Services
HAVING (((HEURES.Année)=[Inscrire l'année]))
ORDER BY HEURES.[No Identité], HEURES.[No Période];

Merci encore si tu peux me proposer une solution.
Norm




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Eric
.../...

Mais puisque tu élimines les doublons dans le décompte par service, no
période et no identité, tu auras, pour le champ sur lequel s'applique la
fonction Compte(), toujours 1 ! ou alors je ne comprends ce que tu veux
faire.

Si c'est cela, alors il me parait plus simple de faire:

SELECT DISTINCT Annnée, [no identité], [no période], services
FROM Heures
WHERE Année=[Inscrire l'année]
ORDER BY [no identité], [no période];

ce qui te retournera la même chose sauf le nb mais comme c'est une
constante = à 1 c'est pas génant.

Si tu tiens à voir s'afficher le 1 alors:
SELECT DISTINCT Annnée, [no identité], [no période], services, 1 As Nb
FROM Heures
WHERE Année=[Inscrire l'année]
ORDER BY [no identité], [no période];

(Suis peut-être à côté de la plaque)

re,

Attention : Année est un mot réservé pour Access, code plutot
AnneeIntervention ou autrement pour que ca soit plus explicite.
De même éviter les espaces autant que faire se peut dans les noms de
champs et les accents tant qu'on y est. ;-)

En reprenant les noms de tes champs, essaies ceci :

SELECT année, [no identité], [no période], services,
count(services) AS nb
FROM (SELECT DISTINCT services, [no identité], [no période], année
FROM Heures
WHERE Année=[Inscrire l'année])
GROUP BY services, [no identité], [no période], année
ORDER BY [no identité],[no période];



Bonjour Éric,

Merci pour cette réponse. Cependant, les 2 options que tu m'as
proposées ne donnent pas encore tout à fait le résultat recherché.
J'ai probablement pas expliqué (c'est pas toujours facile...)
clairement le but recherché. De plus, afin de simplifier (je n'aurais
pas dû faire cela, peut-être...) l'écriture du message, j'avais aussi
"simplfier" les noms originaux des champs utilisés. Enfin, en
étudiant mes besoins, j'ai constaté qu'un nouveau champ paramétré
(année) doit être inséré dans la requête.

Bon... à la lumière de tes explications et de mes tests précédents
avec cette requête, j'en suis actuellement au code SQL (requête)
ci-dessous. La requête actuelle s'exécute correctement. Cependant
des doublons (compter plusieurs fois) sont encore présents.

Ce que je recherche encore c'est :
Si le No Identité 200 a été inscrit 3 fois à la Période 2 pour le
Service "Urgence" (donc 3 fois le mot "Urgence" pour le même No Id et
la même Période) j'aimerais que la requête ne compte cela que pour 1
seule fois.

Voici, ci-dessous, le code actuel de la requête :
SELECT DISTINCT HEURES.Année, HEURES.[No Identité], HEURES.[No
Période], HEURES.Services, Count(HEURES.Services) AS CompteService
FROM HEURES
GROUP BY HEURES.Année, HEURES.[No Identité], HEURES.[No Période],
HEURES.Services
HAVING (((HEURES.Année)=[Inscrire l'année]))
ORDER BY HEURES.[No Identité], HEURES.[No Période];

Merci encore si tu peux me proposer une solution.
Norm





--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr


Avatar
Norm
Bonjour Éric,

Le code suivant que tu m'as proposé est OK.

SELECT DISTINCT Annnée, [no identité], [no période], services
FROM Heures
WHERE Année=[Inscrire l'année]
ORDER BY [no identité], [no période];

J'obtiens ce que je recherchais.

Gros merci.
Norm