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 02/12/2010, 10h29   #1
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
Par défaut Jointure : Req analyse croisée + Req dernier commentaire = 'le moteur Microsoft Jet ne reconnait pas le champ'

Bonjour !

Me voilà pris au dépourvu devant une requête SQL… Voici mes données :

Table HISTORIQUE
-------------------
Article;Année;Ventes
Article A;2005;750
Article A;2006;800
Article A;2007;789
Article A;2008;815
Article A;2009;856
Article A;2010;905
Article B;2005;436
Article B;2006;521
Article B;2007;598
Article B;2008;605
Article B;2009;647
Article B;2010;689

Table COMMENTAIRES
----------------------
ID;Article;Date;Commentaire
30;Article A;07/12/2007;Commentaire1
31;Article A;17/12/2007;Commentaire2
34;Article A;30/11/2007;Commentaire3
36;Article B;10/12/2007;Commentaire4
37;Article B;10/12/2007;Commentaire5



Je cherche à obtenir une analyse croisée de la table HISTORIQUE avec en bout de ligne le dernier commentaire associé à l’article. Soit le résultat suivant :

Résultat souhaité
-----------------
Article;2005;2006;2007;2008;2009;2010;Date;Commentaire
Article A;750;800;789;815;856;905;17/12/2007;Commentaire2
Article B;436;521;598;605;647;689;10/12/2007;Commentaire5a



Je pensais tous simplement faire une jointure entre les 2 requêtes suivantes mais Access me renvoie un message d’erreur : « Le moteur de la base de données Microsoft Jet ne reconnaît pas ‘T1.Article’ en tant que nom de champ ou expression correcte ».

Req1 : TRANSFORM Sum(HISTORIQUE.Ventes) SELECT HISTORIQUE.Article FROM HISTORIQUE GROUP BY HISTORIQUE.Article PIVOT HISTORIQUE.Année;
Req2 : SELECT T1.Article AS Article, T1.[Date] AS [Date], T1.Commentaire AS Commentaire FROM [COMMENTAIRES] AS T1 WHERE T1.[Date] = (SELECT Max(T2.[Date]) FROM [COMMENTAIRES] T2 WHERE T2.Article = T1.Article) AND T1.[ID] = (SELECT Max(T3.[ID]) FROM [COMMENTAIRES] T3 WHERE T3.Article = T1.Article AND T3.[Date] = T1.[Date]);


Req finale : SELECT * FROM Req1 LEFT JOIN Req2 ON Req1.Article = Req2.Article; Message d'erreur
dut-dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 11h56   #2
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 175
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 175
Points : 2 803
Points : 2 803
Bonjour dut-dut,

Il faut passer par 4 requêtes que je te suggère de créer via l'assistant.
En voici, néanmoins, le code généré :

1-HISTORIQUE_Analyse croisée - liste des ventes par année :
Code sql :
1
2
3
4
5
TRANSFORM Sum(HISTORIQUE.Ventes) AS SommeDeVentes
SELECT HISTORIQUE.Article, Sum(HISTORIQUE.Ventes) AS [Total de Ventes]
FROM HISTORIQUE
GROUP BY HISTORIQUE.Article
PIVOT HISTORIQUE.Année;
2-Article_max_date - repérage de la dernière date de commentaire :
Code :
1
2
3
4
SELECT COMMENTAIRES.Article, Max(COMMENTAIRES.Date) AS MaxDeDate
FROM COMMENTAIRES
GROUP BY COMMENTAIRES.Article
WITH OWNERACCESS OPTION;
3-Article_max_date_Commentaire - à l'aide de la précédente requête, retrouver le dernier commentaire :
Code :
1
2
3
SELECT [2-Article_max_date].Article, [2-Article_max_date].MaxDeDate, COMMENTAIRES.Commentaire
FROM [2-Article_max_date] LEFT JOIN COMMENTAIRES ON ([2-Article_max_date].MaxDeDate = COMMENTAIRES.Date) AND ([2-Article_max_date].Article = COMMENTAIRES.Article)
WITH OWNERACCESS OPTION;
4-HISTORIQUE_Analyse croisée-Article_max_date_Commentaire - adjonction du dernier commentaire à la liste des ventes par année :
Code :
1
2
3
SELECT [1-HISTORIQUE_Analyse croisée].Article, [1-HISTORIQUE_Analyse croisée].[Total de Ventes], [1-HISTORIQUE_Analyse croisée].[2005], [1-HISTORIQUE_Analyse croisée].[2006], [1-HISTORIQUE_Analyse croisée].[2007], [1-HISTORIQUE_Analyse croisée].[2008], [1-HISTORIQUE_Analyse croisée].[2009], [1-HISTORIQUE_Analyse croisée].[2010], [3-Article_max_date_Commentaire].MaxDeDate, [3-Article_max_date_Commentaire].Commentaire
FROM [1-HISTORIQUE_Analyse croisée] LEFT JOIN [3-Article_max_date_Commentaire] ON [1-HISTORIQUE_Analyse croisée].Article = [3-Article_max_date_Commentaire].Article
WITH OWNERACCESS OPTION;

2 observations :
  • je te suggère d'étudier cela via l'assistant, c'est plus parlant ;
  • dans ton exemple, l'article B ayant 2 dernières dates de commentaire identiques, tu obtiens 2 lignes pour l'article B, ce qui est normal. Si tu ne veux qu'une ligne, il faut dire à Access quelle est la donnée qui "décide" qu'une ligne est à sélectionner plutôt que l'autre (peut-être avec l'heure).
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/12/2010, 12h36   #3
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
A force de vouloir "emboîter" les instructions SQL pour éviter de stocker des requêtes intermédiaires, j'avais réussi à embrouiller Access (et moi par la même occasion )

Merci de ta réponse. Ca fonctionne très bien.


Citation:
Envoyé par Richard_35 Voir le message
  • dans ton exemple, l'article B ayant 2 dernières dates de commentaire identiques, tu obtiens 2 lignes pour l'article B, ce qui est normal. Si tu ne veux qu'une ligne, il faut dire à Access quelle est la donnée qui "décide" qu'une ligne est à sélectionner plutôt que l'autre (peut-être avec l'heure).
J'ai effectivement déjà pensé convertir le format de mon champ pour intégrer l'heure en cas de commentaires postés à la même date... Pour le moment j'ai préféré, rajouté une requête pour identifier l'ID le plus élevé et retomber sur mes pieds.

@+
dut-dut 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 11h04.


 
 
 
 
Partenaires

Hébergement Web