OVH Cloud OVH Cloud

Calcul d'une moyenne réduite

15 réponses
Avatar
Sylvain Labbé
Bonjour,

J'ai une base de données contenant des codes de professions (520) et des
taux de salaire horaire.

Je dois calculer la moyenne réduite pour chaque profession. J'ai fait une
requête qui élimine les enrigistrements incohérent et tri ceux restant par
code de profession et taux de salaire. Ex. :

Dernier emploi Tx horaire
12 10,00 $
12 11,18 $
12 12,48 $
12 13,63 $
12 14,80 $
12 15,00 $
12 15,96 $
12 16,83 $
12 17,28 $
12 20,71 $
12 20,74 $
12 21,79 $
12 23,62 $
12 26,43 $
12 32,27 $
12 40,00 $

Chaque profession a un nombre d'enregistrements différents.

Est-il possible de calculer la moyenne en ne tenant pas compte de 10% des
enregistrements inférieurs et supérieurs ?

J'ai pensé à quelque chose qui :
1) compte le nombre d'enregistrements pour chaque professions (count);
2) trouve le nombre d'enregistrements à ne pas ternir compte (count*0,1);
3) fait la moyenne des enregistrements restant.

Mais comment écrire cette requête ?

Merci

10 réponses

1 2
Avatar
Pierre CFI [mvp]
bonjour
hum essaie çà
1 req regroupement avec Moyenne comme opérateur pour tx emploi, regroupement pour deremploi
tu nommes SalMoyen ce champ
SalMoyen : txEmploi
puis tu fais une req avec la table et la req myenne
Deremploi
et
Tx pris en compte : VraiFaux([txhoraire] <= [SalMoyen]*0,9;0;VraiFaux([txhoraire]>=[salmoyen]*1,1;0;[txhoraire]))

comme critére <>0


--
Pierre CFI
MVP Microsoft Access

Site pour bien commencer
Access http://www.mpfa.info

"Sylvain Labbé" <Sylvain Labbé@discussions.microsoft.com> a écrit dans le message de news:

Bonjour,

J'ai une base de données contenant des codes de professions (520) et des
taux de salaire horaire.

Je dois calculer la moyenne réduite pour chaque profession. J'ai fait une
requête qui élimine les enrigistrements incohérent et tri ceux restant par
code de profession et taux de salaire. Ex. :

Dernier emploi Tx horaire
12 10,00 $
12 11,18 $
12 12,48 $
12 13,63 $
12 14,80 $
12 15,00 $
12 15,96 $
12 16,83 $
12 17,28 $
12 20,71 $
12 20,74 $
12 21,79 $
12 23,62 $
12 26,43 $
12 32,27 $
12 40,00 $

Chaque profession a un nombre d'enregistrements différents.

Est-il possible de calculer la moyenne en ne tenant pas compte de 10% des
enregistrements inférieurs et supérieurs ?

J'ai pensé à quelque chose qui :
1) compte le nombre d'enregistrements pour chaque professions (count);
2) trouve le nombre d'enregistrements à ne pas ternir compte (count*0,1);
3) fait la moyenne des enregistrements restant.

Mais comment écrire cette requête ?

Merci




Avatar
Sylvain Labbé
Merci

J'ai essayé mais cela ne fonctionne pas.

Une des premières étapes que j'ai fait a été d'éliminer les codes de
professions qui avaient moins de 12 enregistrements par cette formule comme
critère :
In (SELECT [Dernier emploi] FROM [Guide Tx Salaire] As Tmp GROUP BY [Dernier
emploi] HAVING Count(*)>12)

En fait, dans l'exemple pour la profession 12, comme il y a 16
enregistrements : il faut ne pas tenir compe de deux enregistrements (le
premier et le dernier), donc le 10$ et et 40$. La moyenne des 16
enregistrements est de 19.55$ alors qu'avec la moyenne réduite on obtient
18.77$.

La fonction existe dans Excel : MOYENNE.REDUITE(plage;% de valeurs à ne pas
tenir compte). En anglais, il s'agit de TRIMMEAN.



Bonjour,

J'ai une base de données contenant des codes de professions (520) et des
taux de salaire horaire.

Je dois calculer la moyenne réduite pour chaque profession. J'ai fait une
requête qui élimine les enrigistrements incohérent et tri ceux restant par
code de profession et taux de salaire. Ex. :

Dernier emploi Tx horaire
12 10,00 $
12 11,18 $
12 12,48 $
12 13,63 $
12 14,80 $
12 15,00 $
12 15,96 $
12 16,83 $
12 17,28 $
12 20,71 $
12 20,74 $
12 21,79 $
12 23,62 $
12 26,43 $
12 32,27 $
12 40,00 $

Chaque profession a un nombre d'enregistrements différents.

Est-il possible de calculer la moyenne en ne tenant pas compte de 10% des
enregistrements inférieurs et supérieurs ?

J'ai pensé à quelque chose qui :
1) compte le nombre d'enregistrements pour chaque professions (count);
2) trouve le nombre d'enregistrements à ne pas ternir compte (count*0,1);
3) fait la moyenne des enregistrements restant.

Mais comment écrire cette requête ?

Merci




Avatar
3stone
Salut,

"Sylvain Labbé"
[...]
| La fonction existe dans Excel : MOYENNE.REDUITE(plage;% de valeurs à ne pas
| tenir compte). En anglais, il s'agit de TRIMMEAN.



Essaies ceci :


Public Function fnTrimMean(argPercent As Double, _
ParamArray argA() As Variant) As Double
Dim voXlApp As Excel.Application
Set voXlApp = New Excel.Application
fnTrimMean = voXlApp.WorksheetFunction.TrimMean(argA(), argPercent)
voXlApp.Quit
Set voXlApp = Nothing
End Function



--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/
Avatar
Gilbert
Bonsoir,

Dans Excel, avec ton exemple, on obtient 18,77 avec une moyenne réduite à
0.2 et 19.55 avec une moyenne réduite à 0.1
En fait sur 16 enregistrement la moyenne réduite à 0.1 te donne la même
valeur que la moyenne.
Extrait de l'aide d'Excel:
La fonction MOYENNE.REDUITE arrondit le nombre d'observations à exclure au
multiple de 2 immédiatement inférieur. Si l'argument pourcentage = 0,1, 10%
de 30 observations égale 3. Pour préserver la symétrie, la fonction
MOYENNE.REDUITE exclura une seule valeur à chaque extrémité de la série de
données.
Pour 16 enregistrements 10% de 16=1.6. Le multiple de 2 immédiatement
inférieur est 0.

Peut-être faut-il modifier tes critères. Soit prendre 0.2, soit exclure les
codes des professions qui ont moins de 22 enregistrements.

Gilbert


"Sylvain Labbé" a écrit dans le
message de news:
Merci

J'ai essayé mais cela ne fonctionne pas.

Une des premières étapes que j'ai fait a été d'éliminer les codes de
professions qui avaient moins de 12 enregistrements par cette formule
comme

critère :
In (SELECT [Dernier emploi] FROM [Guide Tx Salaire] As Tmp GROUP BY
[Dernier

emploi] HAVING Count(*)>12)

En fait, dans l'exemple pour la profession 12, comme il y a 16
enregistrements : il faut ne pas tenir compe de deux enregistrements (le
premier et le dernier), donc le 10$ et et 40$. La moyenne des 16
enregistrements est de 19.55$ alors qu'avec la moyenne réduite on obtient
18.77$.

La fonction existe dans Excel : MOYENNE.REDUITE(plage;% de valeurs à ne
pas

tenir compte). En anglais, il s'agit de TRIMMEAN.



Bonjour,

J'ai une base de données contenant des codes de professions (520) et des
taux de salaire horaire.

Je dois calculer la moyenne réduite pour chaque profession. J'ai fait
une


requête qui élimine les enrigistrements incohérent et tri ceux restant
par


code de profession et taux de salaire. Ex. :

Dernier emploi Tx horaire
12 10,00 $
12 11,18 $
12 12,48 $
12 13,63 $
12 14,80 $
12 15,00 $
12 15,96 $
12 16,83 $
12 17,28 $
12 20,71 $
12 20,74 $
12 21,79 $
12 23,62 $
12 26,43 $
12 32,27 $
12 40,00 $

Chaque profession a un nombre d'enregistrements différents.

Est-il possible de calculer la moyenne en ne tenant pas compte de 10%
des


enregistrements inférieurs et supérieurs ?

J'ai pensé à quelque chose qui :
1) compte le nombre d'enregistrements pour chaque professions
(count);


2) trouve le nombre d'enregistrements à ne pas ternir compte
(count*0,1);


3) fait la moyenne des enregistrements restant.

Mais comment écrire cette requête ?

Merci






Avatar
Eric
Bonjour,

Autre solution, se coder une fonction. Par exemple, à copier dans un
module global :
Function fnMoyenneReduite(NomTable As String, _
NomChampCalcul As String, _
Pourcent As Single, NomChampWhere As String, _
ChampWhere As Double) As Double

Dim rst As DAO.Recordset, Total As Double, cpt As Long
Dim Exclu As Integer
Dim strSQL As String, varArray
strSQL = "select [" & NomChampCalcul & "] From [" & NomTable & "] " _
& "Where [" & NomChampWhere & "]=" & ChampWhere
Set rst = CurrentDb.OpenRecordset(strSQL)
rst.MoveLast: rst.MoveFirst
cpt = rst.RecordCount
Exclu = Int(Pourcent * cpt / 2)
varArray = rst.GetRows(cpt)
For i = LBound(varArray, 2) + Exclu To UBound(varArray, 2) - Exclu
Total = Total + varArray(0, i)
Next i
fnMoyenneReduite = Total / (cpt - 2 * Exclu)
Set rst = Nothing
End Function

Et dans la requête, en suppposant la table nommée Feuil1:
champ1:Dernier emploi
Opération : Regroupement
Champ2 : Moyenne Réduite: fnMoyenneReduite("Feuil1";"Tx
Horaire";0,2;"Dernier Emploi";[Dernier Emploi])
Opération : Expression
Champ3 : [Tx Horaire]
Opération : Moyenne



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

J'ai une base de données contenant des codes de professions (520) et des
taux de salaire horaire.

Je dois calculer la moyenne réduite pour chaque profession. J'ai fait une
requête qui élimine les enrigistrements incohérent et tri ceux restant par
code de profession et taux de salaire. Ex. :
bonjour,


qqchose de la forme :

select der_emploi, avg(Tx_horaire) from tb group by der_emploi;

Dernier emploi Tx horaire
12 10,00 $
12 11,18 $
12 12,48 $
12 13,63 $
12 14,80 $
12 15,00 $
12 15,96 $
12 16,83 $
12 17,28 $
12 20,71 $
12 20,74 $
12 21,79 $
12 23,62 $
12 26,43 $
12 32,27 $
12 40,00 $

Chaque profession a un nombre d'enregistrements différents.

Est-il possible de calculer la moyenne en ne tenant pas compte de 10% des
enregistrements inférieurs et supérieurs ?


inferieurs à quoi ?

cordialement
G

J'ai pensé à quelque chose qui :
1) compte le nombre d'enregistrements pour chaque professions (count);
2) trouve le nombre d'enregistrements à ne pas ternir compte (count*0,1);
3) fait la moyenne des enregistrements restant.

Mais comment écrire cette requête ?

Merci




Avatar
Sylvain Labbé
Bonjour Éric,

Ta solution m'inspirait, j'ai donc commencé par la tienne.

J'ai essayé avec tes indications mais j'obtient ce message d'erreur :
"Erreur de compilation :
Type défini par l'utilisateur no défini"

Avec cet élément en surbrillance dans la fonction :
"rst As DAO.Recordset"

Dans la requête, au lieu d'une table je fait référence à une requête. Est-ce
cela le problèeme ?

Bonne journée


Bonjour,

Autre solution, se coder une fonction. Par exemple, à copier dans un
module global :
Function fnMoyenneReduite(NomTable As String, _
NomChampCalcul As String, _
Pourcent As Single, NomChampWhere As String, _
ChampWhere As Double) As Double

Dim rst As DAO.Recordset, Total As Double, cpt As Long
Dim Exclu As Integer
Dim strSQL As String, varArray
strSQL = "select [" & NomChampCalcul & "] From [" & NomTable & "] " _
& "Where [" & NomChampWhere & "]=" & ChampWhere
Set rst = CurrentDb.OpenRecordset(strSQL)
rst.MoveLast: rst.MoveFirst
cpt = rst.RecordCount
Exclu = Int(Pourcent * cpt / 2)
varArray = rst.GetRows(cpt)
For i = LBound(varArray, 2) + Exclu To UBound(varArray, 2) - Exclu
Total = Total + varArray(0, i)
Next i
fnMoyenneReduite = Total / (cpt - 2 * Exclu)
Set rst = Nothing
End Function

Et dans la requête, en suppposant la table nommée Feuil1:
champ1:Dernier emploi
Opération : Regroupement
Champ2 : Moyenne Réduite: fnMoyenneReduite("Feuil1";"Tx
Horaire";0,2;"Dernier Emploi";[Dernier Emploi])
Opération : Expression
Champ3 : [Tx Horaire]
Opération : Moyenne



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



Avatar
Pierre CFI [mvp]
bonjour
regarde dans outils/ref charge microsoft dao 3...

--
Pierre CFI
MVP Microsoft Access

Site pour bien commencer
Access http://www.mpfa.info

"Sylvain Labbé" a écrit dans le message de news:

Bonjour Éric,

Ta solution m'inspirait, j'ai donc commencé par la tienne.

J'ai essayé avec tes indications mais j'obtient ce message d'erreur :
"Erreur de compilation :
Type défini par l'utilisateur no défini"

Avec cet élément en surbrillance dans la fonction :
"rst As DAO.Recordset"

Dans la requête, au lieu d'une table je fait référence à une requête. Est-ce
cela le problèeme ?

Bonne journée


Bonjour,

Autre solution, se coder une fonction. Par exemple, à copier dans un
module global :
Function fnMoyenneReduite(NomTable As String, _
NomChampCalcul As String, _
Pourcent As Single, NomChampWhere As String, _
ChampWhere As Double) As Double

Dim rst As DAO.Recordset, Total As Double, cpt As Long
Dim Exclu As Integer
Dim strSQL As String, varArray
strSQL = "select [" & NomChampCalcul & "] From [" & NomTable & "] " _
& "Where [" & NomChampWhere & "]=" & ChampWhere
Set rst = CurrentDb.OpenRecordset(strSQL)
rst.MoveLast: rst.MoveFirst
cpt = rst.RecordCount
Exclu = Int(Pourcent * cpt / 2)
varArray = rst.GetRows(cpt)
For i = LBound(varArray, 2) + Exclu To UBound(varArray, 2) - Exclu
Total = Total + varArray(0, i)
Next i
fnMoyenneReduite = Total / (cpt - 2 * Exclu)
Set rst = Nothing
End Function

Et dans la requête, en suppposant la table nommée Feuil1:
champ1:Dernier emploi
Opération : Regroupement
Champ2 : Moyenne Réduite: fnMoyenneReduite("Feuil1";"Tx
Horaire";0,2;"Dernier Emploi";[Dernier Emploi])
Opération : Expression
Champ3 : [Tx Horaire]
Opération : Moyenne



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





Avatar
Sylvain Labbé
Bonjour,

J'ai essayé mais j'obtient un message d'erreur :
"Fonction 'FnTrimMean' non définie dans l'expression."

1) J'ai copié vous indications dans un module et sauvegardé le module sous
le nom "FnTrimMean".
2) J'ai ajouté un champ "moyred" a ma requête avec cette syntaxe :
moyred: FnTrimMean("0,2";"RemHoraire")

Où est mon erreur ?
J'utilise Access et Excel 2002

Merci et bonne journée


Salut,

"Sylvain Labbé"
[...]
| La fonction existe dans Excel : MOYENNE.REDUITE(plage;% de valeurs à ne pas
| tenir compte). En anglais, il s'agit de TRIMMEAN.



Essaies ceci :


Public Function fnTrimMean(argPercent As Double, _
ParamArray argA() As Variant) As Double
Dim voXlApp As Excel.Application
Set voXlApp = New Excel.Application
fnTrimMean = voXlApp.WorksheetFunction.TrimMean(argA(), argPercent)
voXlApp.Quit
Set voXlApp = Nothing
End Function



--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/




Avatar
3stone
Salut,

"Sylvain Labbé"

| 1) J'ai copié vous indications dans un module et sauvegardé le module sous
| le nom "FnTrimMean".


Tu ne peux pas nommer un module comme une fonction qu'il contient !!

Préfixe tes modules par mod_


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/
1 2