Requêtes demandées

  • Nombre de clients par pays
  • Argent rapporté par pays du client
  • Argent rapporté par les ventes en France
  • Nombre d'ouvrages par pays
  • Argent rapporté par auteur
  • Auteurs nés dans la même ville

Solutions

--
-- Nombre de clients par pays
-- Jointure interne entre Client et Lieux
--
select Pays, count(*) from Client INNER JOIN Lieux on Client.Ville = Lieux.Ville group by Pays;

--
-- Argent rapporte par pays du client
-- Jointures internes permettant de faire le lien entre le prix d un livre et le pays
--
select Pays, sum(Prix) from Client
  INNER JOIN Lieux ON Client.Ville = Lieux.Ville
  INNER JOIN Achat ON Client.id = Achat.idClient
  INNER JOIN Livre ON Livre.isbn = Achat.isbn
group by pays;

--
-- Argent rapporte par les ventes en France
--
select Pays, sum(Prix) from Client
  INNER JOIN Lieux ON Client.Ville = Lieux.Ville
  INNER JOIN Achat ON Client.id = Achat.idClient
  INNER JOIN Livre ON Livre.isbn = Achat.isbn
where Pays like 'France'
group by Pays;

--
-- Argent rapporte par auteur
--
select Nom, sum(prix) from Auteur
  INNER JOIN AuteurLivre ON Auteur.id = AuteurLivre.idAuteur
  INNER JOIN Achat ON AuteurLivre.idLivre = Achat.ISBN
  INNER JOIN Livre ON Livre.ISBN = Achat.ISBN
group by Nom;

--
-- Nombre d'ouvrages par pays
--
-- Un livre peut avoir plusieurs auteurs qui peuvent être nés dans différents pays
-- Il faut donc dans un premier temps lier les livres aux pays,
-- sans créer de doublons (deux auteurs nés dans le même pays)
--
-- Il ne restera ensuite qu a regrouper les données pour les compter en utilisant
-- les résultats obtenus précédemment (sous requête)
--
select Pays, count(*) from
(
select distinct idLivre, Pays from Auteur
inner join Lieux on Auteur.LieuNaissance = Lieux.Ville
inner join AuteurLivre on Auteur.id = AuteurLivre.idAuteur) as t
group by Pays;

--
-- Auteurs nés dans la même ville
--
-- Comparer deux auteurs veut dire comparer les lignes d'une même table
-- donc faire appel deux fois à une même table. C est ce qui est fait ici
-- en leur donnant deux alias différents.
--
-- Il ne reste plus qu'à s'assurer que le lieu de naissance est identique
-- mais que l identifiant est différent
--
select l1.LieuNaissance, l1.Nom, l2.Nom
from Auteur l1
  INNER JOIN Auteur l2 ON l1.LieuNaissance = l2.LieuNaissance
where l1.id <> l2.id;