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 :

SQL multicritères sur dates


Sujet :

Requêtes et SQL.

  1. #1
    LB
    LB est déconnecté
    Membre actif
    Inscrit en
    Février 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 33
    Par défaut SQL multicritères sur dates
    Bonjour à tous,

    je parviens généralement à trouver des réponses à mes interrogations en consultant différents sites sur l'Internet, mais cette fois je reste bloqué.

    Sous C++, je tente une requête SQL sur une table Access de quelques dizaines de milliers d'enregistrements.
    Les champs à considérer: idTable (champ auto), Date (champ date), Compte (champ texte).

    Par exemple, les enregistrements suivants:

    Date Compte
    10/10/2014 0123
    12/12/2014 0123
    05/05/2013 2345

    01/01/2013 3456
    10/10/2009 3456
    15/10/2010 0123
    20/10/2010 2345
    25/12/2010 4567

    Les enregistrements dont la date est <= 01/01/2013 seront supprimés si le même compte n'existe pas à une date > 01/01/2013.

    Résultat des lignes supprimées:

    Date Compte
    01/01/2013 3456
    10/10/2009 3456
    25/12/2010 4567

    J'ai tenté les requêtes imbriquées avec les opérateurs NOT EXISTS, NOT IN et autre MINUS sans succès.

    D'avance merci pour votre aide.

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 400
    Billets dans le blog
    48
    Par défaut
    Bonsoir,

    je pense que la requête ci-dessous répond au besoin :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT LaTable.LaDate,
           LaTable.LeCompte
    FROM   LaTable
           LEFT JOIN (SELECT LeCompte
                      FROM   LaTable
                      WHERE  LaDate >#1/1/2013#) SousReq
                  ON LaTable.LeCompte = SousReq.LeCompte
    WHERE  LaTable.LaDate <=#1/1/2013#
           AND SousReq.LeCompte IS NULL;

    On peut le faire avec NOT EXISTS mais je ne suis pas sûr des performances de l'opérateur sous Access.

  3. #3
    LB
    LB est déconnecté
    Membre actif
    Inscrit en
    Février 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 33
    Par défaut
    Bonjour et merci d'avoir répondu.
    Ci-dessous votre exemple que j'essaye d'adapter avec une erreur dans la clause JOIN:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       ADOQuery->SQL->Clear();
       ADOQuery->SQL->Add ("SELECT LaDate, LeCompte FROM LaTable T1");
       ADOQuery->SQL->Add ("LEFT JOIN (SELECT LeCompte FROM LaTable T2");
       ADOQuery->SQL->Add ("WHERE T2.LaDate > #04/06/2012#)");
       ADOQuery->SQL->Add ("ON T2.LeCompte = T1.LeCompte");
       ADOQuery->SQL->Add ("WHERE T1.LaDate <= #04/06/2012#");
       ADOQuery->SQL->Add ("AND T2.LeCompte IS NULL");
       ADOQuery->ExecSQL();
    Une erreur de syntaxe ?

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 400
    Billets dans le blog
    48
    Par défaut
    Bonjour,

    l'alias T2 est mal placé et il manque des espaces.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       ADOQuery->SQL->Clear();
       ADOQuery->SQL->Add ("SELECT LaDate, LeCompte FROM LaTable T1_");
       ADOQuery->SQL->Add ("LEFT JOIN (SELECT LeCompte FROM LaTable T2_");
       ADOQuery->SQL->Add ("WHERE T2.LaDate > #04/06/2012#) T2_");
       ADOQuery->SQL->Add ("ON T2.LeCompte = T1.LeCompte_");
       ADOQuery->SQL->Add ("WHERE T1.LaDate <= #04/06/2012#_");
       ADOQuery->SQL->Add ("AND T2.LeCompte IS NULL");
       ADOQuery->ExecSQL();

  5. #5
    LB
    LB est déconnecté
    Membre actif
    Inscrit en
    Février 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 33
    Par défaut
    D'accord, merci Fabien.
    Mais dans ce cas j'obtiens l'erreur suivante 'le champ LeCompte peut désigner plusieurs tables listées dans la clause FROM'

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 400
    Billets dans le blog
    48
    Par défaut
    Ah oui, peut-être à la ligne 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT T1.LaDate, T1.LeCompte FROM LaTable T1

  7. #7
    LB
    LB est déconnecté
    Membre actif
    Inscrit en
    Février 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 33
    Par défaut
    Oui, j'ai déjà essayé mais le message 'Type de données incompatible dans l'expression du critère'.
    Peut-être un problème de format de date ?

    J'ai tenté avec #03/06/2012# puis '03/06/2012' et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ADOQuery->SQL->Add ("WHERE DateComite < :LaDatePlus) C2 ");
    ADOQuery->Parameters->ParamByName("LaDatePlus")->Value = PlusDeDeuxAns;
    ou PlusDeDeuxAns est défini comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         TDateTime PlusDeDeuxAns = EncodeDate(AA,MM,JJ);
         PlusDeDeuxAns = PlusDeDeuxAns - 730;

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 400
    Billets dans le blog
    48
    Par défaut
    là c'est plus un problème de C++, je ne vais pas pouvoir t'aider.

    Les dates en SQL Access doivent être au format US avec des '#' pour encadrer la date : #mm/dd/yyyy#.

  9. #9
    LB
    LB est déconnecté
    Membre actif
    Inscrit en
    Février 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 33
    Par défaut
    Merci Fabien pour ton aide.
    Si quelqu'un a une idée....

Discussions similaires

  1. Requête SQL select sur date
    Par delavega dans le forum ASP
    Réponses: 2
    Dernier message: 08/01/2012, 16h50
  2. Calcul sur date dans SQL
    Par Tchupacabra dans le forum WinDev
    Réponses: 4
    Dernier message: 27/02/2006, 19h23
  3. [sql server] requête sur dates et heures (format du résultat
    Par isachat666 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/02/2006, 13h48
  4. [Interbase 6] tri sur date et SQL
    Par Yogy dans le forum InterBase
    Réponses: 6
    Dernier message: 21/06/2005, 09h15
  5. [SQL] Conditions sur une date dans une requete
    Par poufouille dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2004, 14h25

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