Vous êtes sur la page 1sur 6

TECH 60701 -- Technologies de l'intelligence d'affaires

* 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 :

Vous faites face au problème suivant : « AdventureWorks aimerait


que vous développiez un schéma en étoile facilitant l’analyse du
processus de fabrication des produits en termes de quantité à
fabriquer, quantité qui a échoué à l'inspection de la qualité et
quantité fabriquée et mise en inventaire. La compagnie veut que
vous lui fournissiez une table de fait et des tables dimension
qui pourront détailler les jours de fabrication (par exemple,
les dates de début et de fin du processus de fabrication), les produits
fabriqués, les raisons éventuelles pour la perte en cours de
production (« scrap »). Il serait également intéressant de pouvoir
analyser
le processus de fabrication de manière à voir s'il y a plus de
pertes le matin lorsque les machines sont froides et que les employé(e)s
ne sont pas encore suffisamment caféiné(e)s. Safety first! (Note
: même si dans AdventureWorks, les heures ne sont actuellement pas
enregistrées (elles apparaissent sous la forme 00), vos
collègues vous assurent que ces données sont disponibles sur une autre
source
de données, donc le ou les modèles que vous produisiez doivent
tenir compte du temps.)

En plus des attributs que vous souhaitez inclure, les


utilisateurs vous indiquent certains de leurs besoins spécifiques liés à
l’analyse
comme, par exemple :
• Pour la date, il faudra être facile à accéder i) au jour
de la semaine, ii) la semaine de l’année, iii) le trimestre.
• Pour le produit, il faudra inclure son i) nom, ii) sous-
catégorie, iii) catégorie , iv) gamme (productline). »

a) Quel est le « grain » (ou le niveau de granularité) de


cette problématique ?
b) Développez le modèle conceptuel d’un schéma en étoile de
cette problématique.
c) Développez le modèle logique d’un schéma en étoile de
cette problématique.
d) Quelles dimensions peuvent être modélisées logiquement
en tant que dimensions de type 2 ? Pourquoi ?

Détaillez vos réponses dans un fichier Word (.docx).

Vous pouvez développer vos modèles à la main (tout en vous


assurant qu'ils sont lisibles), prendre une photo et l'inclure dans le
document Word.
*/

/*
Question #2 :

Pour garder un œil sur la possibilité de fraude, AdventureWorks


voudrait que vous donniez la liste des commandes faites par des
clients individuels (personne physique) pour lesquelles
l'adresse complète de livraison diffère de l'adresse complète de
facturation.
Le rapport devrait contenir les attributs suivant :

• 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

Triez le résultat par le nom du client en ordre alphabétique


descendant.
*/

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 :

Suite à l'excellent travail accompli jusqu'à présent, la


directrice des ventes arrive à votre bureau. Elle aimerait faire
une analyse des ventes faits par les commis de ventes
employé(e)s par AdventureWorks (identifié(e)s dans la base de données
avec des titres de poste de « Sales Representative »).

Elle souhaite centrer son analyse sur les ventes enregistrées au


quatrième trimestre ainsi qu'aux deuxième et troisième semaines
de l'année. (L'analyse couvre toutes les années disponibles dans
la base de données).

Elle détaille pour vous le format requis du rapport :

________________________________________________________________________
__________________________
| Nom du comis | Nombre de ventes | Somme sous-total des
ventes | Valeur moyenne d'une vente
----------------------------------------------------------------
----------------------------------
| ... | ... |
... |
...

Elle vous rappelle qu'elle veut la valeur de la somme du sous-


total des ventes et la valeur moyenne d'une vente affichées
en format monnaie.

Triez les résultats en fonction de la somme du sous-total des


ventes par ordre descendant.
*/

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 :

Votre réputation chez AdventureWorks commence à grandir !! Comme


faire du bon travail ne reste jamais impuni, vous recevez une autre
tâche :)

Impressionnée par votre travail jusqu'à maintenant, la


directrice des ventes aimerait avoir un rapport sur les produits de
l'entreprise. Plus
précisément, pour chaque produit de l'entreprise qui s'est vendu
plus de 100 fois, elle aimerait savoir combien de fois il s'est vendu
(et non
pas combien d'unités ont été vendus), la moyenne de ces ventes
(en format monnaie) et le titre de sa documentation (si le produit a de
la
documentation). De plus, elle souhaite que le titre du produit
soit présenté dans un format particulier et sa couleur, en français.
Elle souhaite que le rapport soit trié par identifiant de
produit dans l'ordre croissant. Votre rapport doit contenir seulement
les colonnes
suivantes avec les données dans le format qui apparaît :

ProductID |Description du produit


|Couleur |Titre du document
|Nombre de fois que le produit a
été vendu |Moyenne des ventes
...
709 |Mountain Bike Socks, M (SO-B909-M) |
Blanc |Pas de documentation
disponible |188
|$32.24
711 |Sport-100 Helmet, Blue (HL-U509-B) |
Bleu |Pas de documentation
disponible |3090
|$53.53
...
804 |HL Fork (FK-9939)
|Aucune couleur spécifiée |Pas de documentation
disponible |117
|$521.66
...
935 |LL Mountain Pedal (PD-M282) |
Argent / Noir |Installing Replacement Pedals
|195
|$55.94
...
*/

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

Vous aimerez peut-être aussi