Introduction à SQL

 

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.

Les tables Fournisseurs et Plantes
Highslide JS

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

Extrait des données
Highslide JS

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

Extrait des données en résultat
Highslide JS

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

Extrait des données en résultat
Highslide JS

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.

Extrait des données en résultat
Highslide JS

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