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 26/05/2011, 15h10   #1
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
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 :
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 :
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.
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h17   #2
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
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 :
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 ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h50   #3
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
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
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h55   #4
Membre Expert
 
Avatar de nico84
 
Homme Nicolas Guimbal
Consultant/développeur ERP
Inscription : mai 2008
Messages : 1 254
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Guimbal
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 1 254
Points : 1 870
Points : 1 870
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 :
select * from matable where madate=dmax("madate","matable","macle=" & macle)
nico84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 17h00   #5
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
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.
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 17h08   #6
Membre Expert
 
Avatar de nico84
 
Homme Nicolas Guimbal
Consultant/développeur ERP
Inscription : mai 2008
Messages : 1 254
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Guimbal
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 1 254
Points : 1 870
Points : 1 870
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
nico84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 17h14   #7
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
merci infiniment pour la réponse je vais regarder ça
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 18h46   #8
Candidat au titre de Membre du Club
 
Inscription : mai 2003
Messages : 25
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 25
Points : 12
Points : 12
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 :
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);
ericain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 10h41   #9
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
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 :
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 ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 10h43   #10
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
j'ai essayé ça



Code SQL :
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
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 10h51   #11
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
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 :
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
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 11h04   #12
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
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 ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 11h07   #13
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
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 ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 11h20   #14
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
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.
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 11h36   #15
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Code :
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 ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 11h54   #16
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
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
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 11h59   #17
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
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 ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 12h05   #18
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
Citation:
Envoyé par Nitromard Voir le message
Le EXISTS se met à la place du IN. Essayez peut être avec cet exist.
Marche tjrs pas :-(
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 12h41   #19
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
Citation:
Envoyé par elsergio Voir le message
Marche tjrs pas :-(
pour ceux que ca intéresse, j'ai réussi en faisant :

Code SQL :
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);
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2011, 11h29   #20
Membre Expert
 
Avatar de nico84
 
Homme Nicolas Guimbal
Consultant/développeur ERP
Inscription : mai 2008
Messages : 1 254
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Guimbal
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 1 254
Points : 1 870
Points : 1 870
D'où sort iddate dans ta requête ???

Code :
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 :
1
2
SELECT IDF, IDC, DATF FROM MaTable T
Where T.DATF=Dmax("datf","MaTable","idc=" & T.idc)
Idem avec un double select :
Code :
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 :
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
nico84 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 16h49.


 
 
 
 
Partenaires

Hébergement Web