SQLite : Jointure avec 3 tables d'une base de données.

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

SQLite : Jointure avec 3 tables d'une base de données.

Message par falsam »

Dans cet exemple, les tables seront réduites à leurs stricts minimums.
Objectif de cet exercice : Calculer un chiffre d'affaire par client et connaitre sa localisation départementale.

3 Tables :
Départements (Numéro département + Nom)
Client (Identification Client + Nom + Numéro département)
Chiffre d'affaire (Identification Client + Montant)

La base de données sera de type SQLite en mémoire.

Pour faire une jointure entres deux tables (TableA et TableB) ayant un identifiant commun (id) on utilisera la syntaxe suivante

Code : Tout sélectionner

SELECT *
 FROM tableA
 JOIN tableB
 ON tableA.id = tableB.id ;
Passons à la pratique avec le code documenté ci-dessous.

Code : Tout sélectionner

Enumeration
  #DataBase
EndEnumeration

UseSQLiteDatabase()

Global ReqSql.s

If OpenDatabase(#DataBase, ":memory:", "", "")
  Debug "Connecté"
  
  ;Creation de la table département
  ReqSql = "CREATE TABLE departements ("
  ReqSql + "numdep INTEGER," ;Numéro de département
  ReqSql + "nom TEXTE" ;Libéllé du département 
  ReqSql + ");"
  
  DatabaseUpdate(#DataBase, ReqSql)       
  Debug DatabaseError()

  ;Creation de la table client
  ;l'identification client est une clé automatique autoincrémentée
  ReqSql = "CREATE TABLE clients ("
  ReqSql + "idcli INTEGER PRIMARY KEY," ;Identifiant client automatiquement incrémenté
  ReqSql + "nom TEXT," ;Nom
  ReqSql + "numdep INTEGER" ;Numéro de département 
  ReqSql + ");"
  
  DatabaseUpdate(#DataBase, ReqSql)       
  Debug DatabaseError()

  ;Creation de la table chiffre d'affaire
  ReqSql = "CREATE TABLE ca ("
  ReqSql + "idcli INTEGER,"
  ReqSql + "montant INTEGER"
  ReqSql + ");"
  
  DatabaseUpdate(#DataBase, ReqSql)       
  Debug DatabaseError()
      
  ;Ajouts de quelques données dans les tables Departement 
  ;On insere le département + le nom du département
  DatabaseUpdate(#DataBase, "insert into departements(numdep, nom) values('1','Ain')")
  DatabaseUpdate(#DataBase, "insert into departements(numdep, nom) values('2','Aisne')")
  DatabaseUpdate(#DataBase, "insert into departements(numdep, nom) values('3','Allier')")
  DatabaseUpdate(#DataBase, "insert into departements(numdep, nom) values('4','Alpes-de-Haute-Provence')")
  
  ;Ajouts de quelques données dans les tables clients
  ;On insere le numéro du département ainsi que le nom du client 
  ;Le numéro de département (numdep) pointe sur la table des départements (numdep)
  DatabaseUpdate(#DataBase, "insert into clients(numdep, nom) values('1','Joe Palier')") ;identification client = 1
  DatabaseUpdate(#DataBase, "insert into clients(numdep, nom) values('2','Jia Abalur')") ;identification client = 2
  DatabaseUpdate(#DataBase, "insert into clients(numdep, nom) values('4','William Dufi')") ;identification client = 3
  DatabaseUpdate(#DataBase, "insert into clients(numdep, nom) values('4','Camelia Rosana')") ;identification client = 4
  
  ;Ajouts de quelques données dans les tables Chiffre d'Affaire (ca) 
  ;On insere l'identification client (idcli) + le montant du chiffre d'affaire (montant)
  ;l'identification client (idcli) pointe sur la table client (idcli)
  DatabaseUpdate(#DataBase, "insert into ca(idcli, montant) values('1','100')")
  DatabaseUpdate(#DataBase, "insert into ca(idcli, montant) values('4','100')")
  DatabaseUpdate(#DataBase, "insert into ca(idcli, montant) values('1','200')")
  DatabaseUpdate(#DataBase, "insert into ca(idcli, montant) values('1','400')")
  
  ;Chiffre d'affaire client
  ReqSql = "SELECT clients.nom, sum(ca.montant), departements.nom"
  ReqSql + " FROM clients "
  ReqSql + " JOIN departements"
  ReqSql + " JOIN ca"
  ReqSql + " ON (clients.idcli = ca.idcli) AND (clients.numdep = departements.numdep)"
  ReqSql + " GROUP BY clients.idcli"
  
  DatabaseQuery(0, ReqSql)
  Debug DatabaseError()
    
  ;Affichage du résultat de la requete
  While NextDatabaseRow(0)
    Debug GetDatabaseString(0, 0) + " | " +  GetDatabaseString(0, 1)+ " | " +  GetDatabaseString(0, 2)
  Wend
  
Else
  Debug DatabaseError()      
EndIf
SUM() Retourne la somme de toutes les valeurs numériques.
Pour avoir un calcul par client, je l'ai associé avec la clause GROUP BY (Fonction qui calcule le niveau de regroupement)

Résultat
Connecté

Joe Palier | 700 | Ain
Camelia Rosana | 100 | Alpes-de-Haute-Provence
N'étant pas un sujet traitant de la 3D, je comprends que ce n'est pas forcement palpitant :p Toutefois Pure Basic est aussi un puissant gestionnaire de base de données SQLite (en natif), PostgreSQL( en natif) et d'autres bases de données comme MySQl moyennant l'utilisation d'un fichier include faisant le lien entre Pure Basic et une DLL (ici libmysql.dll) gérant les transasctions avec cette base de données.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: SQLite : Jointure avec 3 tables d'une base de données.

Message par microdevweb »

Merci Falsam pour tuto très intéressant toujours Utile sur les bases Sql :wink:
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: SQLite : Jointure avec 3 tables d'une base de données.

Message par Micoute »

Merci microdevweb pour m'avoir fait découvrir ce tuto et grand merci aussi à falsam pour l'avoir partagé.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre