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 :

Requête d'apparence hyper simple mais sans solution [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut Requête d'apparence hyper simple mais sans solution
    Bon déjà je suis désolé de venir poser une question qui va apparaître à tout le monde super simple. C'est pas faute d'avoir cherché, d'avoir demandé (à deux amis supposés être compéténts dans le sql). Je me suis balladé sur le forum. J'ai rien vu qui aurait pu m'aider. Mon problème est super simple :

    - 1 table facture
    - 3 champs :
    1/ IDF identifiant facture (sans doublons)
    2/ IDC identifiant client (avec doublons)
    3/ DATF date de la facture

    Je veux pour chaque client l'identifiant de la dernière facture ainsi que la date correspondante. J'ai utilisé cette syntaxe mais il me renvoie un tableau qui contient toutes les factures :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TABLE.IDC, Max(TABLE.DATF) AS MaxDeDATF, TABLE.IDF INTO essai
    FROM [TABLE]
    GROUP BY TABLE.IDC, TABLE.IDF;
    J'ai essayé
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TABLE.IDC, Max(TABLE.DATF) AS MaxDeDATF, TABLE.IDF INTO essai
    FROM [TABLE]
    GROUP BY TABLE.IDC;
    Mais access m'affiche un message d'erreur comme quoi la fonction d'agrégat peut pas être utilisé dans ce cas-là. J'ai bien compris qu'en r=faisant group by (identifiant de facture) ca ne pouvait pas marché vu que les identifiant facture sont tous différents. Je me demande s'ils ne faut pas créer une autre variable qui soit lié à la date max mais j'en suis pas sûr. Merci d'avance de votre aide!!!

    ps: j'ai mis en pieces jointes le fichier access qui contient la table en question. On a 20027 contacts.

  2. #2
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bonjour,

    En fait le problème vient du regroupement par ton identifiant de facture, comme il est différent partout, et que tu regroupe par rapport à lui alors tu auras exactement la mm table qu'au départ, il faut alors faire 2 fois une sélection de date maximale, une fois par regroupement unique sur le client et ensuite sur les 2.

    Je te propose donc cette solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT TABLE.IDC, Max(TABLE.DATF) AS MaxDeDATF, TABLE.IDF INTO essai
    FROM [TABLE]
    Where TABLE.DATF IN (
    Select Max(DATF)
    FROM [TABLE]
    Group by IDC)
    GROUP BY TABLE.IDC, TABLE.IDF;

    Cordialement,

    Quentin
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  3. #3
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    J'ai fais tourné ton code, ça ne marche toujours pas en revanche ça m'a donné une idée. Merci pour le temps que tu as passé dessus. Très cool de ta part. Je vous tiens au courant

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Bonjour,

    Effectivement ce n'est pas une requête simple puisqu'il faut interroger 2 fois la même table
    Dans le même ordre d'idée c'est plus lisible avec Dmax:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from matable where madate=dmax("madate","matable","macle=" & macle)
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  5. #5
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Finalement j'ai toujours pas réussi à m'en sortir même si je sens que y'a du bon dans ce que dit Nitromard.

    Sinon Nico, ca a l'air super intéressant, y'a moyen que tu développes parce que j'ai pas compris ce que c'était que dmax.

  6. #6
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Dmax, Dmin, Dsum, Dcount, Dlookup... sont des fonctions qui peuvent remplacer un select pas trop complexe. Il doit être relativement facile de trouver de la doc dessus. Les 3 arguments sont :
    - le champ
    - la table
    - la condition where
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  7. #7
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    merci infiniment pour la réponse je vais regarder ça

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 25
    Points : 20
    Points
    20
    Par défaut
    As tu essaye de creer un champ combine afin d avoir une clef unique : combiner MAX(Table.DATF) et IDC ? Ce serait un truc du genre :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Table.IDC, Table.DATF, Table.IDF FROM Table WHERE Table.DATF & Table.IDC IN (SELECT Last(Table.DATF) & Table.IDC FROM Table GROUP BY Table.IDC);
    Le travail c'est la santé, ne rien faire c'est la préserver!

  9. #9
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bonjour,

    Pourrais-tu détailler en quoi la requête que je t'ai fournie ne fonctionne pas?
    J'ai testé avec des données simple du genre :
    IDF, IDC, DATF
    1, X, 31/12/2010
    2, X, 20/11/2010
    3, Y, 15/03/2006
    4, Y, 12/01/2007
    5, Y, 21/09/2001
    6, Z, 06/01/2001
    7, Z, 07/05/2000

    Et cela fonctionne bien. J'obtiens les numéros de factures, les numéros des clients (apparation unique de clients) et les dates maximales, cad les dernières dates de factures.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Table1.IDF, Table1.IDC, Max(Table1.DATF)
    FROM Table1
    WHERE Table1.DATF IN (
    SELECT MAX(DATF)
    FROM Table1
    Group by IDC)
    Group by Table1.IDF, Table1.IDC;
    (à quoi sert ton INTO essai?)
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  10. #10
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    j'ai essayé ça



    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT TABLE.IDC, TABLE.IDF
    FROM [TABLE]
    Where (TABLE.IDC, TABLE.DATF) IN (
    Select TABLE.IDC, Max(DATF)
    FROM [TABLE]
    Group by TABLE.IDC)
    mais il m'affiche un message d'erreur comme quoi je devrais utiliser une clause EXIST. Si quelqu'un comprend ça m'intéresse

  11. #11
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Nitromard Voir le message
    Bonjour,

    Pourrais-tu détailler en quoi la requête que je t'ai fournie ne fonctionne pas?
    J'ai testé avec des données simple du genre :
    IDF, IDC, DATF
    1, X, 31/12/2010
    2, X, 20/11/2010
    3, Y, 15/03/2006
    4, Y, 12/01/2007
    5, Y, 21/09/2001
    6, Z, 06/01/2001
    7, Z, 07/05/2000

    Et cela fonctionne bien. J'obtiens les numéros de factures, les numéros des clients (apparation unique de clients) et les dates maximales, cad les dernières dates de factures.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Table1.IDF, Table1.IDC, Max(Table1.DATF)
    FROM Table1
    WHERE Table1.DATF IN (
    SELECT MAX(DATF)
    FROM Table1
    Group by IDC)
    Group by Table1.IDF, Table1.IDC;
    (à quoi sert ton INTO essai?)

    je ne comprends pas pourquoi ça ne marche pas, mais lorsque je fais tourner ta requête, j'ai autant de lignes qu'il y a de factures. Si tu veux il y a des doublons dans la colonne identifiant client.

    voici un copier coller d'un bout de la table que ta requête me sort

    IDC MaxDeDATF IDF
    176 01/05/2010 7359
    176 01/06/2011 21419

    or je veux qu'une seule ligne par client. Celle qui correspond a la derniere facture. En gros ta requête me renvoie la table de départ avec les colonnes identifiant client et datefacture permutées.

    ps : oui la table essai ne sert à rien

  12. #12
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Hé bien, je ne comprends pas, cela devrais fonctionner...
    Tente juste une chose, inverse dans le dernier group by le IDF et le IDC pour voir...
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  13. #13
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Si cela ne marche encore pas, enlève le TABLE.IDF du group by...
    Teste, cela ne coute rien ^^
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  14. #14
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Nitromard Voir le message
    Hé bien, je ne comprends pas, cela devrais fonctionner...
    Tente juste une chose, inverse dans le dernier group by le IDF et le IDC pour voir...
    Fais chier ca marche toujours pas.
    Il me donne le même tableau, autant de lignes qu'il y a de factures.
    Merci quand même.

  15. #15
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT TABLE.IDF, TABLE.IDC, Max(TABLE.DATF)
    FROM [TABLE]
    Where TABLE.DATF IN (
    Select Max(DATF)
    FROM [TABLE]
    Group by IDC)
    GROUP BY TABLE.IDC, TABLE.IDF;
    Bon essaye voir celle là... Et après je pense qu'il faudra peut être essayé avec des jointures sur la même table...(change voir le nom de ta talbe, on appelle pas TABLE une table lol donne lui un nom du genre facture.)
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  16. #16
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Ouais j'avais déjà essayé d'inverser IDC et IDF. Ca marche toujours pas. Exact pour la table TABLE ca craint quand même lol. Je sais plus quoi faire pour cette satanée requête j'ai même rajouté un "EXISTS" devant le WHERE sans rien y comprendre

  17. #17
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Le EXISTS se met à la place du IN. Essayez peut être avec cet exist.
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  18. #18
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Nitromard Voir le message
    Le EXISTS se met à la place du IN. Essayez peut être avec cet exist.
    Marche tjrs pas :-(

  19. #19
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par elsergio Voir le message
    Marche tjrs pas :-(
    pour ceux que ca intéresse, j'ai réussi en faisant :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TABLE_1.IDC, TABLE_1.DATF, TABLE_1.IDF
    FROM iddate INNER JOIN [TABLE] AS TABLE_1 ON (iddate.MaxDeDATF = TABLE_1.DATF) AND (iddate.IDC = TABLE_1.IDC);

  20. #20
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 107
    Points : 5 230
    Points
    5 230
    Par défaut
    D'où sort iddate dans ta requête ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT TABLE.IDF, TABLE.IDC, Max(TABLE.DATF)
    FROM [TABLE]
    Where TABLE.DATF IN (
    Select Max(DATF)
    FROM [TABLE]
    Group by IDC)
    GROUP BY TABLE.IDC, TABLE.IDF;
    Cette requête sélectionne TOUTES les factures puisqu'il y a idf dans le group by

    La difficulté est de sélectionner la date max ET UNIQUEMENT le n° de facture associée. Avec Dmax ça s'écrit je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT IDF, IDC, DATF FROM MaTable T
    Where T.DATF=Dmax("datf","MaTable","idc=" & T.idc)
    Idem avec un double select :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT IDF, IDC, DATF FROM MaTable T
    Where datf = (select max(datf) from MaTable where MaTable.idc=T.idc)
    Avec IN cela trouve toutes les factures d'un client dont la date correspond au dmax de n'importe quel autre client

    Avec mes requêtes ci-dessus (et probablement aussi avec la tienne) si un client a eu plusieurs factures ce jour là ça les trouve toutes

    Finalement je ne trouve que cette solution qui marche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select distinct idc
    , dmax("datf","matable","idc=" & t.idc)
    , (select max(idf) from matable where idc=t.idc and datf=dmax("datf","matable","idc=" & t.idc))
    from matable t
    Pas "super simple" donc
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

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

Discussions similaires

  1. Requête en apparence simple mais
    Par kokolargol dans le forum Requêtes
    Réponses: 1
    Dernier message: 30/10/2009, 09h35
  2. Programme tout simple mais sans fenetre
    Par pip1000 dans le forum Débuter
    Réponses: 6
    Dernier message: 10/02/2009, 20h02
  3. Requête peut être simple, mais compliquée pour moi !
    Par xfree dans le forum Langage SQL
    Réponses: 11
    Dernier message: 17/08/2007, 16h09
  4. Requête access exécutée mais sans résultat
    Par gids01 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 28/02/2007, 09h33
  5. Pb de COUNT et GROUP BY simple mais sans requête imbriquées
    Par vanquish dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/10/2004, 09h45

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