Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/10/2011, 01h01   #1
Invité de passage
 
Homme kostia
Inscription : octobre 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme kostia
Localisation : Equateur

Informations forums :
Inscription : octobre 2011
Messages : 7
Points : 0
Points : 0
Par défaut Calculer une Moyenne Mobile

Bonjour a tous,

Je dispose d'une table avec par exemple une colonne "Nombre" qui contient 1000 enregistrements.

Je veux avoir une requette ou une nouvelle table qui contient une nouvelle colonne "MoyenneMobile" et bien entendu ma colonne "Nombre".

Dans cette colonne "MoyenneMobile" je cherche a calculer la moyenne (mobile) par exemple des 20 enregistrements precedents.
C'est a dire que par exemple, sur la ligne 20 de ma table, je vais veux voir apparaitre le resultat du calcul suivant : (ValeurLigne 1 + ValeurLigne 2 + ...+ValeurLigne 20)/20
Sur la ligne 21 de ma table, je vais veux voir apparaitre le resultat du calcul suivant : (ValeurLigne 2 + ValeurLigne 3 + ...+ValeurLigne 21)/20
Et ainsi de suite.

Bien entendu, je cherche a rendre parametrable cela, c'est a dire que je compte pouvoir facilement changer la taille de ma Moyenne mobile, c'est a dire par exemple realiser une moyenne mobile sur les 10, 20 et pourquoi 100 derniers enregistrements.

Je suis un peu perdu pour savoir comment realiser cela. Je ne sais pas si il y a des solutions grace aux requetes, ou s'il faut se tourner vers du VBA...?

Je suis en train de découvrir l'acces aux données avec DAO et Recordset et je ne sais pas si c'est une solution.

Pour info, ma table risque d'avoir entre 100.000 et 1.000.000 lignes.

Je vous remercie par avance pour votre aide.

Amicalement,

Kostia
Kostiaannecy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2011, 10h50   #2
Membre confirmé
 
Homme
Chercheur
Inscription : juin 2011
Messages : 150
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Tarn (Midi Pyrénées)

Informations professionnelles :
Activité : Chercheur
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : juin 2011
Messages : 150
Points : 231
Points : 231
Bonjour,

Utilisez la fonction DAvg (MoyDom) qui est paramétrable à volonté. Attention cependant à avoir un champ type Numauto qui vous permette d'avoir un ordre fixe de vos enregistrements et de les sélectionner par le critère de recherche.

BCdt
fbtsra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2011, 17h59   #3
Invité de passage
 
Homme kostia
Inscription : octobre 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme kostia
Localisation : Equateur

Informations forums :
Inscription : octobre 2011
Messages : 7
Points : 0
Points : 0
Par défaut Comment utiliser cette fonction?

Citation:
Envoyé par fbtsra Voir le message
Bonjour,

Utilisez la fonction DAvg (MoyDom) qui est paramétrable à volonté. Attention cependant à avoir un champ type Numauto qui vous permette d'avoir un ordre fixe de vos enregistrements et de les sélectionner par le critère de recherche.

BCdt
Merci pour votre aide. Cependant je reste toujours un peu bloqué. Non pas sur l'utilité de cette fonction mais comment l'utiliser pour lui dire de ne prendre en compte que les X derniers enregistrements?
Par exemple, si je veux realiser une moyenne mobile sur les 10 derniers enregistrements. Comment dire a la fonction DAvg de ne prendre en compte que les champs qui sont compris entre le numero de cle actuel et le numero de cle actuel - 10 ?

Je vous remercie pour votre aide

Kostia
Kostiaannecy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 08h14   #4
Membre confirmé
 
Homme
Chercheur
Inscription : juin 2011
Messages : 150
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Tarn (Midi Pyrénées)

Informations professionnelles :
Activité : Chercheur
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : juin 2011
Messages : 150
Points : 231
Points : 231
Bonjour,

En utilisant la fonction :

Code :
1
2
 
MoyDom("x";"y";"[clé]>[clé actuel]-10 AND [clé]<=[clé actuel]")
Je ne peux pas vous aider plus sur la syntaxe sans connaitre vos tables/champs , ni savoir ou et comment vous voulez faire ce calcul ...

Bcdt
fbtsra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 18h03   #5
Invité de passage
 
Homme kostia
Inscription : octobre 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme kostia
Localisation : Equateur

Informations forums :
Inscription : octobre 2011
Messages : 7
Points : 0
Points : 0
Bonjour Fbtsra,
Merci pour votre aide. Pour vous donner un peu plus de precisions, voici ma requete "RqMoy" qui n'affiche que deux colonnes de ma table:

Clé primaire : [ID]
Valeur : [Valeur]

J'ai 100.000 lignes

Je compte créer una colonne "MoyenneMobile" qui réaliser la moyenne mobile des X precentes valeurs de "Valeur".

Voici un exemple :
Le resultat de ma requette "RqMoy"

ID Valeur
1 1.5
2 1.6
3 1.8
4 2
5 1.9
6 1.7
8 1.6
9 1.5
...
100000 2.1

Si par exemple je compte avoir le resultat d'une moyenne mobile de 3, c'est a dire qui realise la moyenne des 3 derniers enregistrements, je voudrais obtenir le resultat de la requette suviante :

ID Valeur MoyenneMobile
1 1.5 -
2 1.6 -
3 1.8 1.6333
4 2 1.8
5 1.9 1.9
6 1.7 1.8666
8 1.6 1.7333
9 1.5 1.6
...
100000 2.1 2.3

J'ai essayé d'utiliser la fonction DAvg mais je ne sais pas comme dire a cette fonction de ne prendre en compte que les 3 dereniers enregistrements.

Voici par exemple l'une des formules que j'ai essayé mais qui ne marche pas :
MoyenneMobile: DAvg("[Valeur]";"RqMoy";"[ID]>[ID]-3 AND [ID]<=[ID]")
Si je ne mets aucun crtiere, la requette m'affiche immediatement la moyenne de tous les enregistrements.

Si vous pouviez me donner un petit coup de main ce serait génial.

Je vous remercie d'avannce.


Kostia
Kostiaannecy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 09h08   #6
Membre confirmé
 
Homme
Chercheur
Inscription : juin 2011
Messages : 150
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Tarn (Midi Pyrénées)

Informations professionnelles :
Activité : Chercheur
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : juin 2011
Messages : 150
Points : 231
Points : 231
Bonjour,

Voici la requête répondant à vos attentes :

Code :
1
2
3
SELECT RqMoy.ID, RqMoy.Valeur, DAvg("[Valeur]","RqMoy","[ID]>" & [ID]-[Moyenne sur :] & " AND [ID]<=" & [ID] & "") AS MoyenneMobile, *
FROM RqMoy
WHERE (((RqMoy.ID)>[Moyenne sur :]-1));
elle va vous demander [Moyenne sur :] qui correspond à 3 dans votre exemple.

Bcdt
fbtsra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 15h06   #7
Membre chevronné
 
Avatar de alassanediakite
 
Homme Alassane Diakité
Conseil - Consultant en systèmes d'information
Inscription : août 2006
Messages : 539
Détails du profil
Informations personnelles :
Nom : Homme Alassane Diakité
Âge : 34
Localisation : Mali

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information

Informations forums :
Inscription : août 2006
Messages : 539
Points : 604
Points : 604
Envoyer un message via Yahoo à alassanediakite
Salut
Puisqu'il peut y avoir des trous dans les ID, je te propose...
code à mettre dans un module standard
Code :
1
2
3
4
5
6
7
8
9
10
11
Public Function lamoyennemobile(id As Long, tranche As Integer)
Dim rs As DAO.Recordset
Dim str As String
str = "SELECT Avg(rq.lanote) AS moyenne FROM (SELECT TOP " & tranche & "  Feuil1.noteclasse AS lanote FROM Feuil1 WHERE (((Feuil1.numeroligne)<=" & id & ")) ORDER BY Feuil1.numeroligne DESC) AS rq;"
Set rs = CurrentDb.OpenRecordset(str)
If Not (rs.EOF And rs.BOF) Then
lamoyennemobile = rs(0)
Else
lamoyennemobile = 0
End If
End Function
code de la requête
Code :
1
2
SELECT Feuil1.numeroligne, Feuil1.noteclasse, lamoyennemobile([numeroligne],5) AS moyennne
FROM Feuil1;
"Feuil1" est à remplacer par le nom de ta table. Tu peux automatiser en remplaçant la tranche (ici le 5) par
Code :
Forms![le nom du formulaire qui lance la requête]![le nom de la zone de texte qui contient la tranche]
@+
__________________
Le monde est trop bien programmé pour être l’œuvre du hasard…
alassanediakite est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h21.


 
 
 
 
Partenaires

Hébergement Web