IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Garder enregistrements selon date [AC-2000]


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Points : 6
    Points
    6
    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...

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    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

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    J'essayerai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Merci bcp
    Ca avance.

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    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

  7. #7
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    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

  8. #8
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    J'ai donc modifier la 2eme sous requete d'origine mais j'ai une erreur de syntaxe

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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]))));

  9. #9
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  10. #10
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Ben non ca marche pas...

    J'en suis toujours à mon erreur de syntaxe, ou comment aller chercher la maxdate du mois du datamart

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    j'ai pas tout suivi mais la sous-requête qui va chercher la date maxi du datamart c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Trouver un enregistrement selon la date SAUF l'heure
    Par pelloq1 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/09/2014, 13h34
  2. Rechercher dernier enregistrement selon date max
    Par Asdorve dans le forum Requêtes
    Réponses: 9
    Dernier message: 12/09/2012, 14h15
  3. [AC-2007] Afficher après jointure selon date enregistrements vides
    Par Soya113 dans le forum Access
    Réponses: 4
    Dernier message: 29/12/2011, 11h06
  4. Sélectionner 1 seul enregistrements selon la date la plus grande
    Par Ronaldinho dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 17/08/2009, 13h26
  5. [Access] dernier enregistrement selon date
    Par sebos21 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 24/05/2006, 18h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo