La base de données qui sert d'exemple sur cette page contient 2 tables, une table plantes et une table fournisseurs. Les informations prix... ont été créees pour cet exemple.

Le champs CodeFrs de la table Fournisseurs correspond au champ Fournisseur de la table Plantes pour la relation clé étrangère.

Requête d'affichage du prix moyen par article/
SELECT pl.NomPlante, avg(pl.PrixPlante) AS PrixMoyen
FROM Plantes AS pl
GROUP BY pl.NomPlante
ORDER BY pl.NomPlante;
Ci-dessous, le résultat de la requête précédente

Requête d'aggrégation sans filtre ni jointures, pas de difficultés particulière, en programmation il faudrait écrire un code plus long.
Requête d'affichage de l'article qui a le prix le plus élevé par fournisseur/
SELECT fou.Nomfrs, pl.NomPlante, pl.PrixPlante
FROM Fournisseurs AS fou, Plantes AS pl
WHERE pl.Fournisseur = fou.CodeFrs
AND pl.PrixPlante = (SELECT MAX(p.PrixPlante) FROM Plantes p
WHERE p.Fournisseur = fou.CodeFrs)
Affichage du résultat

Cette requête montre l'article vendu par un fournisseur qui a le prix le plus élevé parmi les articles vendus par ce fournisseur. Par exemple, parmi les articles vendus par le fournisseur 21 (Centaure), la camomille est l'article qui a le prix le plus élevé
Pour obtenir ce résultat, dans Access, il faut faire une requête corrélée c'est-à-dire une subquery avec un champ en référence à la requête externe. Ce n'est pas considéré comme une requête optimale sur un large volume de données en termes de temps de traitement par les moteurs de bases de données.
Pour cette requête et des données non volumineuse, on peut utiliser VBA (VBA Excel) pour obtenir le même résultat avec des options de présentation et d'affichage d'information supplémentaire.
Sub AnalysePrixMaxParFournisseur()
'Afficher le nom de chaque fournisseur, le nom et le prix le plus élevé de ses articles
Dim ws As Worksheet
Dim ws_art As Worksheet
Dim ws_frs As Worksheet
Dim Val As String
'Références des données sources
With ThisWorkbook
Set ws = ThisWorkbook.Worksheets(3)
Set ws_art = ThisWorkbook.Worksheets("ARTICLES")
Set ws_frs = ThisWorkbook.Worksheets("FOURNISSEURS")
End With
Set r = ws_art.Range("A1").CurrentRegion
Set r_frs = ws_frs.Range("A1").CurrentRegion
With ws
.Activate: .Cells.ClearContents
r.Copy .Range("A1")
derC = .Cells(1, .Columns.Count).End(xlToLeft).Column + 1
.Cells(1, derC).Value = "NomFrs"
.Cells(1, derC + 1).Value = "PrixMAX"
derL = .Cells(.Rows.Count, 1).End(xlUp).Row
Set r = .Range(.Cells(2, derC), .Cells(derL, derC))
'Recherchev avec VBA
'la liste des fournisseurs est triée, on peut optimiser avec Vrai en argument
'de renvoi du premier résultat trouvé
r.Formula = Application.WorksheetFunction.VLookup(r.Offset(, -1), r_frs, 2, True)
'Trie de la colonne du nom des fournisseurs
.Cells(1, derC - 1).Sort Key1:="Fournisseur", Order1:=xlAscending, Header:=xlYes
'Boucle qui affiche "x" à côté du prix max des articles par fournisseur
j = 2
For i = 2 To derL
'on délimite la région de données
Val = .Cells(i, derC).Value
If Val = .Cells(i + 1, derC).Value Then
k = 0
Else
k = i
Set r = .Range(.Cells(j, derC - 2), .Cells(k, derC - 2))
r.Select
'on recherche le prix max pour un fournisseur
PrixMax = Application.WorksheetFunction.Max(r)
'on affiche un "x" pour les articles qui sont égaux au prix max
For Each c In r
If c.Value = PrixMax Then
c.Offset(, 3) = "x"
End If
Next c
j = k + 1
End If
Next i
'on trie les données pour afficher les prix max par fournisseur
.Cells(1, derC + 1).Sort Key1:="PrixMAX", Order1:=xlAscending, Header:=xlYes
End With
End Sub
Ce script est effectivement plus long mais évolutif.

A gauche, ce sont les données du script vba et à droite c'est le résultat de la requête sql.
Le script tag avec un x
le prix max, c'est une option de présentation parmi d'autres. Si la requête sql doit être modifiée pour par exemple afficher le prix maximum par article et non pas par fournisseur, sur Access le sql qui s'applique nécessite des jointures et des techniques avançées.
Le script VBA ci-dessus peut évoluer vers d'autres présentations.
Dernière mise à jour en avril 2021