
Mekki MOURADI
Data Analyst
Rabat, Maroc
À Propos
Data Analyst Junior avec une solide expérience en marketing numérique et des compétences approfondies dans l’utilisation de Microsoft Excel, SQL, Tableau Software et Python.
Data Analysis with SQL : Inform a Business Decision


Liens
Compétences & Outils
Description du projet
- L’entreprise a pour objectif d’augmenter ses ventes. Dans ce sens, le Responsable des Ventes prévoit offrir une incitation monétaire à ses employés.
- Les employés responsables des 5 commandes les plus élevés recevront un bonus en fin d’année.
Objectifs de l'analyse
- Déterminer les 5 commandes les plus élevées et les employés qui ont traité ces commandes afin de récompenser leurs efforts de ventes.
Étapes de l'analyse
Explorer la database

Identifier les Tables à utiliser
- EmployeeID (Employees)
- OrderID (Orders)
- Montant total de la commande :
- Quantity (OrderDetails)
- Price (Products)

Trouver le Nom et Prénom des différents employés ainsi que les OrderID respectifs
SELECT lastname, firstname, orderid
FROM Employees
INNER JOIN Orders
ON employees.employeeid=orders.employeeid
ORDER BY lastname, firstname
LastName | FirstName | OrderID | ||||
---|---|---|---|---|---|---|
Buchanan | Steven | 10248 | ||||
Buchanan | Steven | 10254 | ||||
Buchanan | Steven | 10269 | ||||
Buchanan | Steven | 10297 | ||||
Buchanan | Steven | 10320 |
Regrouper les données nécessaires sous un unique tableau
NB : On remarque que les résultats affichent plusieurs fois la même “OrderID”, il faudra donc penser à agréger le produit de la Quantity et Price pour toutes les lignes contenant la même OrderID ultérieurement pour avoir la Somme Total de la Commande.
SELECT lastname, firstname, orders.orderid, products.productID, quantity, Price
FROM employees
INNER JOIN orders
ON employees.employeeid=orders.employeeid
INNER JOIN orderdetails
ON orders.orderid=orderdetails.orderid
INNER JOIN products
ON orderdetails.productid=products.productid
ORDER BY lastname, firstname

LastName | FirstName | OrderID | ProductID | Quantity | Price | |
---|---|---|---|---|---|---|
Buchanan | Steven | 10248 | 11 | 12 | 21 | |
Buchanan | Steven | 10248 | 42 | 10 | 14 | |
Buchanan | Steven | 10248 | 72 | 5 | 34.799999999999997 | |
Buchanan | Steven | 10254 | 24 | 15 | 4.5 | |
Buchanan | Steven | 10254 | 55 | 21 | 24 |
Les résultats démontrent que certains employés se retrouvent listés 2 fois dans le top 5 des plus grosses commandes (King Robert et Peacock Margaret).
/* Ajout d'une colonne SalesAmount qui reflète le produit de la quantité et du prix
On additionne les différents SalesAmount des lignes comprenant la même orderid grâce à la fonction SUM()*/
SELECT lastname, firstname, orders.orderid, products.productID, quantity, Price, SUM(quantity*price) AS SalesAmount, employees.employeeid
FROM employees
INNER JOIN orders
ON employees.employeeid=orders.employeeid
INNER JOIN orderdetails
ON orders.orderid=orderdetails.orderid
INNER JOIN products
ON orderdetails.productid=products.productid
-- On regroupe par orderid pour agréger les différentes lignes avec la même orderid
GROUP BY orders.orderid
-- Trier les résultats par "SalesAmount" pour identifier les plus grosses commandes
ORDER BY SalesAmount desc

LastName | FirstName | OrderID | ProductID | Quantity | Price | SalesAmount | EmployeeID |
---|---|---|---|---|---|---|---|
Buchanan | Steven | 10372 | 20 | 12 | 81 | 15353.6 | 5 |
King | Robert | 10424 | 35 | 60 | 18 | 14366.5 | 7 |
Peacock | Margaret | 10417 | 38 | 50 | 263.5 | 14104 | 4 |
King | Robert | 10353 | 11 | 12 | 21 | 13427 | 7 |
Peacock | Margaret | 10360 | 28 | 30 | 45.6 | 9244.25 | 4 |
Dodsworth | Anne | 10324 | 16 | 21 | 17.45 | 7698.45 | 9 |
Peacock | Margaret | 10440 | 2 | 45 | 19 | 7246.01 | 4 |
Peacock | Margaret | 10430 | 17 | 45 | 39 | 7245 | 4 |
Davolio | Nancy | 10351 | 38 | 20 | 263.5 | 7103.5999999999904 | 1 |
Peacock | Margaret | 10329 | 19 | 10 | 9.1999999999999993 | 6025.12 | 4 |
3 choix s’offrent donc à nous :
Définir le top 5 des ventes par Somme
/* Ajout d'une colonne SalesAmount qui reflète le produit de la quantité et du prix
On additionne les différents SalesAmount des lignes comprenant la même orderid grâce à la fonction SUM()*/
WITH newtab1 AS (
SELECT lastname, firstname, orders.orderid, products.productID, quantity, Price, SUM(quantity*price) AS SalesAmount, employees.employeeid
FROM employees
INNER JOIN orders
ON employees.employeeid = orders.employeeid
INNER JOIN orderdetails
ON orders.orderid = orderdetails.orderid
INNER JOIN products
ON orderdetails.productid = products.productid
-- On regroupe par orderid pour agréger les différentes lignes avec la même orderid
GROUP BY orders.orderid
-- Trier les résultats par "SalesAmount" pour identifier les plus grosses commandes
ORDER BY SalesAmount desc
LIMIT(5)
)
SELECT lastname, firstname, SalesAmount
FROM newtab1
Lastname | Firstname | SalesAmount |
---|---|---|
Buchanan | Steven | 15353.6 |
King | Robert | 14366.5 |
Peacock | Margaret | 14104 |
King | Robert | 13427 |
Peacock | Margaret | 9244.25 |
Définir le top 5 des employés distincts
WITH ranking AS
(
SELECT
lastname,
firstname,
SUM(price*quantity) AS sales_amount,
ROW_NUMBER() OVER (PARTITION BY lastname ORDER BY SUM(price*quantity) DESC) AS row_num
FROM employees
INNER JOIN orders
ON employees.employeeid = orders.employeeid
INNER JOIN orderdetails
ON orders.orderid = orderdetails.orderid
INNER JOIN products
ON orderdetails.productid = products.productid
GROUP BY orders.orderid, lastname, firstname
)
SELECT lastname, firstname, sales_amount
FROM ranking
WHERE row_num=1
ORDER BY sales_amount DESC
LIMIT 5;
Lastname | Firstname | SalesAmount |
---|---|---|
Buchanan | Steven | 15353.6 |
King | Robert | 14366.5 |
Peacock | Margaret | 14104 |
Dodsworth | Anne | 7698.45 |
Davolio | Nancy | 7103.5999999999904 |
Déterminer la Somme Totale des ventes par employé
/* Ajout d'une colonne SalesAmount qui reflète le produit de la quantité et du prix
On additionne les différents SalesAmount des lignes comprenant la même orderid grâce à la fonction SUM()*/
WITH newtab3 AS (
SELECT lastname, firstname, orders.orderid, products.productID, quantity, Price, SUM(quantity*price) AS TotalSales, employees.employeeid
FROM employees
INNER JOIN orders
ON employees.employeeid = orders.employeeid
INNER JOIN orderdetails
ON orders.orderid=orderdetails.orderid
INNER JOIN products
ON orderdetails.productid = products.productid
-- On regroupe par orderid pour agréger les différentes lignes avec la même orderid
GROUP BY employees.employeeid
-- Trier les résultats par "SalesAmount" pour identifier les plus grosses commandes
ORDER BY TotalSales desc
LIMIT(5)
)
SELECT lastname, firstname, TotalSales
FROM newtab3
Lastname | Firstname | TotalSales |
---|---|---|
Peacock | Margaret | 105696.499999999 |
Davolio | Nancy | 57690.389999999898 |
Leverling | Janet | 42838.35 |
King | Robert | 39772.300000000003 |
Callahan | Laura | 39309.379999999997 |
Conclusion de l'analyse
Cette analyse permet au Responsable des Ventes de choisir l’un des trois scénarios présentés ci-dessous :
Récompenser les employés responsables du top 5 des ventes par Somme :
- Buchanan Steven
- King Robert
- Peacock Margaret
Récompenser les 5 meilleurs employés distincts vis à vis des Commandes les plus élevées :
- Buchanan Steven
- King Robert
- Peacock Margaret
- Dodsworth Anne
- Davolio Nancy
Récompenser les 5 meilleurs employés distincts vis à vis de la Somme Totale des commandes par employé
- Peacock Margaret
- Davolio Nancy
- Leverling Janet
- King Robert
- Callahan Laura