Case Study #1 - Danny's Diner
Introduction
Danny seriously loves Japanese food so in the beginning of 2021, he decides to embark upon a risky venture and opens up a cute little restaurant that sells his
3 favourite foods: sushi, curry and ramen.
Danny’s Diner is in need of your assistance to help the restaurant stay afloat - the restaurant has captured some very basic data from their few months of
operation but have no idea how to use their data to help them run the business.
Problem Statement
Danny wants to use the data to answer a few simple questions about his customers, especially about their visiting patterns, how much money they’ve spent
and also which menu items are their favourite. Having this deeper connection with his customers will help him deliver a better and more personalised
experience for his loyal customers.
He plans on using these insights to help him decide whether he should expand the existing customer loyalty program - additionally he needs help to generate
some basic datasets so his team can easily inspect the data without needing to use SQL.
Danny has provided you with a sample of his overall customer data due to privacy issues - but he hopes that these examples are enough for you to write fully
functioning SQL queries to help him answer his questions!
Danny has shared with you 3 key datasets for this case study:
sales
menu
members
You can inspect the entity relationship diagram and example data below.
Entity Relationship Diagram
Example Datasets
All datasets exist within the dannys_diner database schema - be sure to include this reference within your SQL scripts as you start exploring the data and
answering the case study questions.
Table 1: sales
The sales table captures all customer_id level purchases with an corresponding order_date and product_id information for when and what menu items were
ordered.
customer_id order_date product_id
A 2021-01-01 1
A 2021-01-01 2
A 2021-01-07 2
A 2021-01-10 3
A 2021-01-11 3
A 2021-01-11 3
B 2021-01-01 2
B 2021-01-02 2
B 2021-01-04 1
B 2021-01-11 1
B 2021-01-16 3
B 2021-02-01 3
C 2021-01-01 3
C 2021-01-01 3
customer_id order_date product_id
C 2021-01-07 3
Table 2: menu
The menu table maps the product_id to the actual product_name and price of each menu item.
product_nam
product_id e price
1 sushi 10
2 curry 15
3 ramen 12
Table 3: members
The final members table captures the join_date when a customer_id joined the beta version of the Danny’s Diner loyalty program.
customer_id join_date
A 2021-01-07
B 2021-01-09
Interactive SQL Session
You can use the embedded DB Fiddle below to easily access these example datasets - this interactive session has everything you need to start solving these
questions using SQL.
You can click on the Edit on DB Fiddle link on the top right hand corner of the embedded session below and it will take you to a fully functional SQL editor
where you can write your own queries to analyse the data.
You can feel free to choose any SQL dialect you’d like to use, the existing Fiddle is using PostgreSQL 13 as default.
Serious SQL students have access to a dedicated SQL script in the 8 Week SQL Challenge section of the course which they can use to generate relevant
temporary tables like we’ve done throughout the entire course!
Case Study Questions
Each of the following case study questions can be answered using a single SQL statement:
1. What is the total amount each customer spent at the restaurant?
2. How many days has each customer visited the restaurant?
3. What was the first item from the menu purchased by each customer?
4. What is the most purchased item on the menu and how many times was it purchased by all customers?
5. Which item was the most popular for each customer?
6. Which item was purchased first by the customer after they became a member?
7. Which item was purchased just before the customer became a member?
8. What is the total items and amount spent for each member before they became a member?
9. If each $1 spent equates to 10 points and sushi has a 2x points multiplier - how many points would each customer have?
10. In the first week after a customer joins the program (including their join date) they earn 2x points on all items, not just sushi - how many points
do customer A and B have at the end of January?
Bonus Questions
Join All The Things
The following questions are related creating basic data tables that Danny and his team can use to quickly derive insights without needing to join the
underlying tables using SQL.
Recreate the following table output using the available data:
customer_i product_nam
d order_date e price member
A 2021-01-01 curry 15 N
A 2021-01-01 sushi 10 N
customer_i product_nam
d order_date e price member
A 2021-01-07 curry 15 Y
A 2021-01-10 ramen 12 Y
A 2021-01-11 ramen 12 Y
A 2021-01-11 ramen 12 Y
B 2021-01-01 curry 15 N
B 2021-01-02 curry 15 N
B 2021-01-04 sushi 10 N
B 2021-01-11 sushi 10 Y
B 2021-01-16 ramen 12 Y
B 2021-02-01 ramen 12 Y
C 2021-01-01 ramen 12 N
C 2021-01-01 ramen 12 N
C 2021-01-07 ramen 12 N
Rank All The Things
Danny also requires further information about the ranking of customer products, but he purposely does not need the ranking for non-member purchases so
he expects null ranking values for the records when customers are not yet part of the loyalty program.
product_nam
customer_id order_date e price member ranking
A 2021-01-01 curry 15 N null
A 2021-01-01 sushi 10 N null
A 2021-01-07 curry 15 Y 1
A 2021-01-10 ramen 12 Y 2
A 2021-01-11 ramen 12 Y 3
A 2021-01-11 ramen 12 Y 3
B 2021-01-01 curry 15 N null
B 2021-01-02 curry 15 N null
B 2021-01-04 sushi 10 N null
B 2021-01-11 sushi 10 Y 1
B 2021-01-16 ramen 12 Y 2
B 2021-02-01 ramen 12 Y 3
C 2021-01-01 ramen 12 N null
C 2021-01-01 ramen 12 N null
C 2021-01-07 ramen 12 N null
Case Study Questions
1. What is the total amount each customer spent at the restaurant?
Solution:
SELECT
s.customer_id, Sum(m.price) as Total_Spend
FROM dannys_diner.sales s join dannys_diner.menu m on s.product_id=m.product_id
group by s.customer_id
order by s.customer_id
2. How many days has each customer visited the restaurant?
Solution:
SELECT
customer_id,Count(Distinct(Order_date)) as total_visited_days
FROM dannys_diner.SALES
Group by customer_id
order by customer_id;
3. What was the first item from the menu purchased by each customer?
Solution:
SELECT customer_id,first_order_item
FROM(SELECT
s.customer_id,
FIRST_VALUE (m.product_name)
OVER (
PARTITION BY s.customer_id
ORDER BY s.customer_id,s.order_date,s.product_id) as first_order_item
FROM dannys_diner.sales s join dannys_diner.menu m on s.product_id=m.product_id
order by s.customer_id,s.order_date) as mster_tbl
group by customer_id,first_order_item
order by customer_id
4. What is the most purchased item on the menu and how many times was it purchased by all customers?
Solution:
with master_tbl as (
SELECT
product_id,count(product_id) as count_per_customer
FROM dannys_diner.sales
group by product_id
order by product_id desc)
select product_name,count_per_customer as How_many_times_ordered from master_tbl m join dannys_diner.menu mn on m.product_id=mn.product_id
order by How_many_times_ordered desc
limit 1
5. Which item was the most popular for each customer?
Solution:
with master_tbl as (
SELECT
customer_id,product_id,count(product_id) as count_per_customer,
row_number() over(partition by customer_id order by customer_id,product_id desc) as rn
FROM dannys_diner.sales
group by customer_id,product_id
order by customer_id,product_id desc)
select customer_id,product_name,count_per_customer as How_many_times_ordered from master_tbl m join dannys_diner.menu mn on m.product_id=mn.product_id
where m.rn=1
6. Which item was purchased first by the customer after they became a member?
Solution:
with master_table as(select
s.customer_id,mn.product_name,
row_number() over(partition by s.customer_id order by s.order_date) as rn
from dannys_diner.sales s join dannys_diner.members m
on s.customer_id=m.customer_id and s.order_date>=m.join_date join dannys_diner.menu mn
on s.product_id=mn.product_id)
select customer_id, product_name first_ordered_item_after_becomimg_member from master_table
where rn=1;
7. Which item was purchased just before the customer became a member?
Solution:
with master_table as(select
s.customer_id,mn.product_name,
row_number() over(partition by s.customer_id order by s.order_date desc) as rn
from dannys_diner.sales s join dannys_diner.members m
on s.customer_id=m.customer_id and s.order_date<m.join_date join dannys_diner.menu mn
on s.product_id=mn.product_id)
select customer_id, product_name purchased_just_before_customer_became_member from master_table
where rn=1
8. What is the total items and amount spent for each member before they became a member?
Solution:
with master_table as(
select
s.customer_id,s.product_id
from dannys_diner.sales s join dannys_diner.members m
on s.customer_id=m.customer_id and s.order_date<m.join_date )
select m.customer_id,count(mn.product_id) as total_items,sum(mn.price) as total_price from master_table as m join dannys_diner.menu mn on
m.product_id=mn.product_id
group by m.customer_id
order by m.customer_id;
9. If each $1 spent equates to 10 points and sushi has a 2x points multiplier - how many points would each customer have?
Solution 1:
with master_tbl as(
select s.customer_id,mn.product_id,count(mn.product_id) as total_items,sum(mn.price) as total_price
from dannys_diner.sales as s join dannys_diner.menu mn on s.product_id=mn.product_id
group by s.customer_id,mn.product_id
order by s.customer_id)
select
m.customer_id,
SUM(CASE
WHEN mn.product_name='sushi' THEN mn.price*2*10*m.total_items
ELSE mn.price*10*m.total_items
END) as points
from master_tbl m join dannys_diner.menu mn on m.product_id=mn.product_id
group by m.customer_id
order by m.customer_id
Solution 2:
select
s.customer_id, sum(CASE
WHEN m.product_name='sushi' THEN m.price*2*10
ELSE m.price*10
END) as points
from
dannys_diner.sales s join dannys_diner.menu m on s.product_id=m.product_id
group by s.customer_id
order by s.customer_id;
10. In the first week after a customer joins the program (including their join date) they earn 2x points on all items, not just sushi - how many points do
customer A and B have at the end of January?
Solution:
select
s.customer_id,
SUM(Case
When s.order_date between m.join_date and (m.join_date+6) Then mn.price*2*10
When mn.product_name='sushi' Then mn.price*2*10
else mn.price*10
end) as points
from dannys_diner.sales s
join dannys_diner.members m
on s.customer_id=m.customer_id
join dannys_diner.menu mn
on s.product_id=mn.product_id
where s.order_date<='2021-01-31'
group by s.customer_id
order by s.customer_id;