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 28/12/2011, 11h46   #1
Invité de passage
 
Inscription : octobre 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 14
Points : 1
Points : 1
Par défaut Garder enregistrements selon date

Bonjour

Dans une base de travail, j'historise à chaque mise à jour des statistiques dans une table sous la forme :

date type client1 stat1 stat2 stat3
date type client2 stat1 stat2 stat3
date type client3 stat1 stat2 stat3

la date est donnee dans le fichier de mise à jour

Je ne desire pas garder les stats de chaque mise à jour, mais seulement une par mois, et la plus proche de la fin du mois.

En gros, ce que je voudrais : je fais la mise à jour, j'ajoute mes enregistrements dans la table des stats avec la date de l'import, je verifie si il existe des enregistrements pour le même mois avec une date inferieure et je supprime eventuellement.

J'y arrive pas avec des requetes suppression...
electronedf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 13h03   #2
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
bonjour,

j'ajouterai une requête DELETE avec dans la clause WHERE un truc comme ça :
le Id spécifique au client AND (Date >= DateSerial(Year(DateImport), Month(DateImport), 1) AND Date < DateImport)

Je n'utilise pas dans ce cas l'opérateur Between car les dates extrêmes seraient incluses.

Si la requête est lancé à partir du code VBA, on peut prétraiter Year(DateImport) et Month(DateImport) au moment de l'écriture de la requête.

Attention au format des dates dans une clause WHERE pour ne pas inverser les jours et les mois...

A tester avant mise en production...

@+

Philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 13h35   #3
Invité de passage
 
Inscription : octobre 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 14
Points : 1
Points : 1
Voici le code de la requete suppression qui donne le message d'erreur : "impossible de supprimer dans les tables spécifiées" (alors que je vois bien ce qu'il faut en requete selection)

Code :
1
2
3
DELETE tbl_stats_ID.*, tbl_stats_ID.Date_du_datamart, Month([tbl_stats_ID.Date_du_datamart]), *
FROM tbl_stats_ID, tbl_datamart
WHERE (((tbl_stats_ID.Date_du_datamart)<[tbl_datamart]![Date du datamart]) AND ((Month([tbl_stats_ID.Date_du_datamart]))=Month([tbl_datamart]![Date du datamart])));

La table tbl_datamart contient la date du dernier import
la table tbl_stats_ID contient toutes les statistiques, et notamment celles que je voudrais supprimer en cas de date + récente pour le même mois

Désolé si je suis pas tres clair...
electronedf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 14h36   #4
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
J'essayerai ceci :
Code :
1
2
3
4
 
DELETE ST.*
FROM tbl_stats_ID AS ST
WHERE (ST.MaDate>=(SELECT DateSerial(Year(Max([Date du datamart])), Month(Max([Date du datamart])), 1) AS MinDate FROM tbl_datamart) And ST.MaDate<(SELECT Max([Date du datamart]) AS MaxDate FROM tbl_datamart));
Supprime tous les enregistrements de la table tbl_stats_id du mois (moins la dernière date), pour tous les clients.

Philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 15h03   #5
Invité de passage
 
Inscription : octobre 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 14
Points : 1
Points : 1
Merci bcp
Ca avance.

En mettant le bon champ (a la place de MaDate dans ton code), j'arrive à ce code :

Code :
1
2
3
DELETE ST.*, ST.Date_du_datamart
FROM tbl_stats_ID AS ST
WHERE (((ST.Date_du_datamart)>=(SELECT DateSerial(Year(Max([Date du datamart])), Month(Max([Date du datamart])), 1) AS MinDate FROM tbl_datamart) And (ST.Date_du_datamart)<(SELECT Max([Date du datamart]) AS MaxDate FROM tbl_datamart)));
Seul bémol.
Je dois trouver une solution pour gérer une mise à jour avec un fichier ancien, afin qu'il ne la prenne pas en compte vu qu'il y aura certainement des enregistrements existants du même mois.
Donc ma reference dans ce cas n'est peut être pas la date du datamart mais la date maxi du mois dans la table des stats
electronedf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 15h40   #6
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
Citation:
Donc ma reference dans ce cas n'est peut être pas la date du datamart mais la date maxi du mois dans la table des stats
Dans ce cas, il faut modifier les sous-requêtes pour piocher la date dans la table stats.

Bonne continuation,

Philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 15h51   #7
Invité de passage
 
Inscription : octobre 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 14
Points : 1
Points : 1
Oui j'essaie de le faire mais

La 1ere sous requete est à conserver (minDate comme 1er du mois du datamart)

Par contre, je n'arrive pas à faire la sous requete pour determiner la maxdate, qui doit être la date maxi du mois du datamart
electronedf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 16h12   #8
Invité de passage
 
Inscription : octobre 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 14
Points : 1
Points : 1
J'ai donc modifier la 2eme sous requete d'origine mais j'ai une erreur de syntaxe

Code sql :
1
2
3
DELETE ST.*, ST.Date_du_datamart
FROM tbl_stats_ID AS ST
WHERE (((ST.Date_du_datamart)>=(SELECT DateSerial(Year(Max([Date du datamart])), Month(Max([Date du datamart])), 1) AS MinDate FROM tbl_datamart) And (ST.Date_du_datamart)<(SELECT Max([tbl_stats_ID].[Date_du_datamart]) AS MaxDeDate_du_datamart FROM tbl_stats_ID, tbl_datamart WHERE (((Month([Date_du_datamart]))=Month([tbl_datamart]![Date du datamart]))));
electronedf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 16h31   #9
Invité de passage
 
Inscription : octobre 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 14
Points : 1
Points : 1
J'ai trouvé

Triple condition / 3 sous requetes

>= au 01 du mois du datamart
<= au 31 du mois du datamart

et < au datamart

donc

Code :
1
2
>=(SELECT DateSerial(Year(Max([Date du datamart])), Month(Max([Date du datamart])), 1) AS MinDate FROM tbl_datamart) Et <(SELECT Max(tbl_stats_ID.Date_du_datamart) AS MaxDeDate_du_datamart
FROM tbl_stats_ID, tbl_datamart) Et <=(SELECT DateSerial(Year(Max([Date du datamart])), Month(Max([Date du datamart])), 31) AS MinDate FROM tbl_datamart)
Merci beaucoup Philben car je ne connaissais pas les sous requetes
electronedf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 17h19   #10
Invité de passage
 
Inscription : octobre 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 14
Points : 1
Points : 1
Ben non ca marche pas...

J'en suis toujours à mon erreur de syntaxe, ou comment aller chercher la maxdate du mois du datamart
electronedf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 19h40   #11
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
bonjour,

j'ai pas tout suivi mais la sous-requête qui va chercher la date maxi du datamart c'est :
Code :
1
2
 
(SELECT Max([Date du datamart]) As MaxDate FROM tbl_datamart)
dans tous les cas, pour avoir une requête de suppression aussi complexe, c'est qu'il y a un souci dans les relations entre tes tables...

philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h09.


 
 
 
 
Partenaires

Hébergement Web