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

Langage SQL Discussion :

problème avec MAX(Date)


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 137
    Points : 88
    Points
    88
    Par défaut problème avec MAX(Date)
    Salut ,

    je dispose d'une table omag_valeur contient 4 colonnes ,

    Date RefProduit PC LC

    14/08/2008 P1 10 20
    15/08/2008 P1 20 30
    16/08/2008 P2 50 40
    17/08/2008 P1 80 90


    je veut faire une requete pour selectionner un produit avec la date soit

    la plus récente :

    pour P1 :

    17/08/2008 P1 80 90

    donc j'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String req="SELECT MAX(Date), PC,LC FROM omag_valeur WHERE RefProduit='"+RefProduit+"'" ;
    mais mon SGBD Access me renvoi une l'erreur suivante:

    Vous avez essayé d'exécuter une requête ne comprenant pas l'expression spécifiée 'PC' comme une partie de la fonction d'agrégat.

    merci pour votre aide

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 949
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 949
    Points : 5 848
    Points
    5 848
    Par défaut
    Salut, tu dois regrouper la réponse par max

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT MAX(Date), PC,LC 
    FROM omag_valeur 
    WHERE RefProduit='Refproduit'
    GROUP BY PC,LC

  3. #3
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 137
    Points : 88
    Points
    88
    Par défaut
    merci beaucoup skuatamad

    ça marche maintenant ,est-ce-que ça doit me renvoyer une seule ligne ou plusieurs ?

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    La requête te renverra autant de lignes qu'il y a de couples (PC, LC) différents.

  5. #5
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 137
    Points : 88
    Points
    88
    Par défaut
    merci CinePhil,

    donc coment faire pour ne selectionner q'une seule ligne ayant la date la plus recente comme dans l'exemple ?

  6. #6
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    quelque chose dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM omag_valeur 
    WHERE RefProduit='"+RefProduit+"'
    and date = (select max(date) from omag_valeur)

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Cybher Voir le message
    quelque chose dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM omag_valeur 
    WHERE RefProduit='"+RefProduit+"'
    and date = (select max(date) from omag_valeur)
    Ca m'étonnerais que ça marche dans tous les cas !

    La requête dans le WHERE fournit la plus grande date de toute la table, pas forcément celle du RefProduit demandé !

    Plus compliqué mais il y a des chances que ça marche (aux problèmes éventuels de la syntaxe particulière d'Access pour les jointures ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT *
    FROM omag_valeur AS ov
    INNER JOIN (
      SELECT RefProduit, MAX(Date) AS DateMax
      FROM omag_valeur
      GROUP BY RefProduit
    ) AS t ON ov.RefProduit = t.RefProduit AND ov.Date = t.DateMax
    WHERE ov.RefProduit = '"+RefProduit+"'
    La requête dans le INNER JOIN extrait pour chaque RefProduit son MAX(DATE) et on joint ce résultat avec la table complète pour pouvoir récupérer toutes les colonnes. La restriction dans le WHERE permet de ne récupérer qu'un produit.

  8. #8
    Membre régulier
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 137
    Points : 88
    Points
    88
    Par défaut
    mereci beaucoup CinePhil,

    super , ça marche bien ,je vous souhaite un bon emploi.

    merci aussi à Cybher pour votre aide , j'ai déja testé ceci mais ne marche pas .

  9. #9
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    j'ai une base de données avec plus de 3 millions d'enregistrement, et en essayant de faire la même requête (avec un min) je met plus de 30 minutes pour que le résultat s'affiche, est-ce normal?

    Merci

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    La table est-elle indexée ?
    Au moins sur RefProduit et peut-être aussi sur Date.

  11. #11
    Membre extrêmement actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Points : 1 173
    Points
    1 173
    Par défaut
    Citation Envoyé par qltmi Voir le message
    Bonjour,

    j'ai une base de données avec plus de 3 millions d'enregistrement, et en essayant de faire la même requête (avec un min) je met plus de 30 minutes pour que le résultat s'affiche, est-ce normal?
    Merci
    Avec 3 millions de record, c'est bien normal;

  12. #12
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    oui ma table est indexé sur l'identifiant, mais pas sur la date
    Je ne sais pas si c'est normal ou pas, mais quand je fais seulement un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select id, min(DateAchat) group by id
    les résultats s'affichent presque instantanément.
    Je me demande si c'est pas la jointure qui ralentit le traitement.

  13. #13
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Tu peux essayer de mettre le SELECT qui est dans le INNNER JOIN dans une table temporaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TEMPORARY TABLE t
    SELECT RefProduit, MAX(Date) AS DateMax
      FROM omag_valeur
      GROUP BY RefProduit;
    
    SELECT *
    FROM omag_valeur AS ov
    INNER JOIN t ON 
    ov.RefProduit = t.RefProduit AND ov.Date = t.DateMax
    WHERE ov.RefProduit = '"+RefProduit+"'
    Si c'est encore trop lent, recommence en indexant la table temporaire.

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

Discussions similaires

  1. problème avec Max date
    Par berti dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/07/2011, 15h15
  2. problème avec les dates nulles
    Par shingo dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 30/09/2005, 12h32
  3. probléme avec une date/string dans un CommandText
    Par critok dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/02/2005, 15h30
  4. [SQL] problème avec les date et les group By
    Par Stef784ever dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/11/2004, 09h18
  5. Interbase - dbExpress -> problème avec les dates
    Par marghett dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/07/2004, 03h55

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