TP 1
TP 1
TP 1
* HEC Montréal
* Travail Pratique 1
* Enseignant :
* J01 : Bogdan Negoita
*
* Instructions de remise :
* - Répondre à la question de modélisation dans un
fichier Word (.docx)
* - Répondre aux questions SQL directement dans ce
fichier .sql
* - Les deux fichiers (.docx et .sql) sont à
remettre via ZoneCours dans l'outil de remise de travaux
* - Date de remise : voir les dates sur ZoneCours,
aucun retard permis
*
* Correction :
* - 10% de la note finale, /10
* - Une question qui génère une erreur (ne
s'exécute pas) se verra attribuer automatiquement la note de 0.
* Par conséquent, testez votre code
fréquemment !
*
*/
use AdventureWorks2019
go
/*
Question #1 :
/*
Question #2 :
• Le numéro de la facture
• Le nom complet du client, y compris son titre, deuxième
noms et suffixes, le cas échéant (coupez les valeurs nulles s’il y en
a).
N’oubliez pas d’éliminer les espaces nulles des
extrémités, s'ils existent.
• Première et deuxième ligne d'adresse de livraison.
N’oubliez pas d’éliminer les espaces nulles des extrémités, s'ils
existent.
• Ville de livraison
• Province/état de livraison
• Pays de livraison
• Code postal de livraison
• Première et deuxième ligne d'adresse de facturation.
N’oubliez pas d’éliminer les espaces nulles des extrémités, s'ils
existent.
• Ville de facturation
• Province/état de facturation
• Pays de facturation
• Code postal de facturation
select
soh.SalesOrderNumber,
trim(concat(p.Title, ' ', p.FirstName, coalesce(' ' +
p.MiddleName + ' ',' '), p.LastName, ' ', p.Suffix)) as 'Nom complet du
client',
trim(concat(a1.AddressLine1, a1.AddressLine2)) as 'Adresse
livraison',
a1.City as 'Ville livraison',
sp1.StateProvinceCode as 'Province/État livraison',
sp1.CountryRegionCode as 'Pays livraison',
a1.PostalCode as 'Code postal livraison',
trim(concat(a2.AddressLine1, a2.AddressLine2)) as 'Adresse
facturation',
a2.City as 'Ville facturation',
sp2.StateProvinceCode as 'Province/État facturation',
sp2.CountryRegionCode as 'Pays facturation',
a2.PostalCode as 'Code postal facturation'
from Sales.SalesOrderHeader soh
inner join Person.[Address] a1 on soh.ShipToAddressID = a1.AddressID
inner join Person.StateProvince sp1 on a1.StateProvinceID =
sp1.StateProvinceID
inner join Person.[Address] a2 on soh.BillToAddressID = a2.AddressID
inner join Person.StateProvince sp2 on a2.StateProvinceID =
sp2.StateProvinceID
inner join Sales.Customer c on soh.CustomerID = c.CustomerID
inner join Person.Person p on c.PersonID = p.BusinessEntityID
where ((a1.AddressLine1 <> a2.AddressLine1)
or (isnull(a1.AddressLine2, 0) <> isnull(a2.AddressLine2, 0))
or (a1.City <> a2.City)
or (a1.StateProvinceID <> a2.StateProvinceID)
or (sp1.CountryRegionCode <> sp2.CountryRegionCode)
or (a1.PostalCode <> a2.PostalCode))
and p.PersonType = 'IN'
order by 2 desc
/* Question #3 :
________________________________________________________________________
__________________________
| Nom du comis | Nombre de ventes | Somme sous-total des
ventes | Valeur moyenne d'une vente
----------------------------------------------------------------
----------------------------------
| ... | ... |
... |
...
select
p.LastName as 'Nom complet du comis',
count(soh.SalesOrderID) as 'Nombre de ventes',
format(sum(soh.SubTotal), 'c', 'en-us') as 'Somme sous-total des
ventes',
format(sum(soh.SubTotal) / count(soh.SalesOrderID), 'c', 'en-
us') as 'Valeur moyenne d''une vente'
from Sales.SalesOrderHeader soh
inner join Sales.SalesPerson sp on soh.SalesPersonID =
sp.BusinessEntityID
inner join HumanResources.Employee e on sp.BusinessEntityID =
e.BusinessEntityID
inner join Person.Person p on e.BusinessEntityID = p.BusinessEntityID
where (datepart(quarter, soh.OrderDate) = 4
or datepart(week, soh.OrderDate) in (2, 3))
and e.JobTitle = 'Sales Representative'
group by p.LastName
order by sum(soh.SubTotal) desc
/*
Question #4 :
select
p.ProductID,
concat(p.[Name], ' (', p.ProductNumber, ')') as 'Description du
produit',
Couleur =
case p.Color
when 'Black' then 'Noir'
when 'Blue' then 'Bleu'
when 'Grey' then 'Gris'
when 'Multi' then 'Multi'
when 'Red' then 'Rouge'
when 'Silver' then 'Argent'
when 'Silver/Black' then 'Argent / Noir'
when 'White' then 'Blanc'
when 'Yellow' then 'Jaune'
else 'Aucune couleur spécifiée'
end,
coalesce(d.Title, 'Pas de documentation disponible') as 'Titre
du document',
coalesce(count(sod.ProductID), 'Jamais vendu') as 'Nombre de
fois que le produit a été vendu',
coalesce(format(avg(sod.LineTotal), 'c', 'en-us'), 'N/A') as
'Moyenne des ventes'
from Production.Product p
left join Production.ProductDocument pd on p.ProductID = pd.ProductID
left join Production.Document d on pd.DocumentNode = d.DocumentNode
left join Sales.SalesOrderDetail sod on p.ProductID = sod.ProductID
group by p.ProductID, concat(p.[Name], ' (', p.ProductNumber, ')'),
p.Color, d.Title
having coalesce(count(sod.ProductID), 'Jamais vendu') > 100
order by p.ProductID