-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSql script.sql
More file actions
217 lines (169 loc) · 8.85 KB
/
Sql script.sql
File metadata and controls
217 lines (169 loc) · 8.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
-- What is the total amount each customer spent at the restaurant?
SELECT CUSTOMER_ID, SUM(PRICE)
FROM SALES
INNER JOIN MENU
ON SALES.PRODUCT_ID = MENU.PRODUCT_ID
GROUP BY CUSTOMER_ID
-- How many days has each customer visited the restaurant?
SELECT CUSTOMER_ID, COUNT(DISTINCT(ORDER_DATE))
FROM SALES
GROUP BY CUSTOMER_ID
-- What was the first item from the menu purchased by each customer?
SELECT DISTINCT CUSTOMER_ID,
FIRST_VALUE(PRODUCT_NAME) OVER (PARTITION BY CUSTOMER_ID ORDER BY ORDER_DATE )
FROM SALES
INNER JOIN MENU
ON SALES.PRODUCT_ID = MENU. PRODUCT_ID
-- What is the most purchased item on the menu and how many times was it purchased by all customers?
SELECT COUNT(SALES.PRODUCT_ID), PRODUCT_NAME
FROM SALES
INNER JOIN MENU
ON SALES.PRODUCT_ID = MENU. PRODUCT_ID
GROUP BY PRODUCT_NAME
ORDER BY COUNT(SALES.PRODUCT_ID) DESC
LIMIT 1
-- Which item was the most popular for each customer?
WITH C AS
(SELECT CUSTOMER_ID, Product_ID, COUNT(SALES.PRODUCT_ID) as count_number,
DENSE_RANK() OVER (PARTITION BY CUSTOMER_ID ORDER BY COUNT(SALES.PRODUCT_ID) DESC) as RN
FROM SALES
GROUP BY CUSTOMER_ID, PRODUCT_ID)
SELECT CUSTOMER_ID, PRODUCT_NAME, count_number
FROM C
INNER JOIN MENU
ON C.PRODUCT_ID = MENU. PRODUCT_ID
WHERE rn = 1
-- Which item was purchased first by the customer after they became a member?
WITH C AS (
SELECT SALES.CUSTOMER_ID, PRODUCT_ID, ORDER_DATE, JOIN_DATE,
CASE
WHEN JOIN_DATE > ORDER_DATE
THEN 0
WHEN JOIN_DATE <= ORDER_DATE
THEN 1
END as when_order,
DENSE_RANK () OVER (PARTITION BY SALES.CUSTOMER_ID ORDER BY ORDER_DATE ASC) as rn
FROM SALES
INNER JOIN MEMBERS
ON SALES.CUSTOMER_ID = MEMBERS.CUSTOMER_ID
WHERE when_order = 1
)
SELECT C.CUSTOMER_ID, C.PRODUCT_ID, PRODUCT_NAME
FROM C
INNER JOIN MENU
ON C.PRODUCT_ID= MENU.PRODUCT_ID
WHERE rn=1
-- Which item was purchased just before the customer became a member?
WITH C AS (
SELECT SALES.CUSTOMER_ID, PRODUCT_ID, ORDER_DATE, JOIN_DATE,
CASE
WHEN JOIN_DATE > ORDER_DATE
THEN 0
WHEN JOIN_DATE <= ORDER_DATE
THEN 1
END as when_order,
DENSE_RANK () OVER (PARTITION BY SALES.CUSTOMER_ID ORDER BY ORDER_DATE DESC) as rn
FROM SALES
INNER JOIN MEMBERS
ON SALES.CUSTOMER_ID = MEMBERS.CUSTOMER_ID
WHERE when_order = 0
)
SELECT C.CUSTOMER_ID, C.PRODUCT_ID, PRODUCT_NAME
FROM C
INNER JOIN MENU
ON C.PRODUCT_ID= MENU.PRODUCT_ID
WHERE rn=1
-- What is the total items and amount spent for each member before they became a member?
WITH C AS (
SELECT SALES.CUSTOMER_ID, PRODUCT_ID, ORDER_DATE, JOIN_DATE,
CASE
WHEN JOIN_DATE > ORDER_DATE
THEN 0
WHEN JOIN_DATE <= ORDER_DATE
THEN 1
END as when_order,
DENSE_RANK () OVER (PARTITION BY SALES.CUSTOMER_ID ORDER BY ORDER_DATE DESC) as rn
FROM SALES
INNER JOIN MEMBERS
ON SALES.CUSTOMER_ID = MEMBERS.CUSTOMER_ID
WHERE when_order = 0
)
SELECT C.CUSTOMER_ID, COUNT((C.PRODUCT_ID)), SUM(PRICE)
FROM C
INNER JOIN MENU
ON C.PRODUCT_ID= MENU.PRODUCT_ID
GROUP BY C.CUSTOMER_ID
-- If each $1 spent equates to 10 points and sushi has a 2x points multiplier - how many points would each customer have?
SELECT SALES.CUSTOMER_ID,
SUM(CASE
WHEN PRODUCT_NAME = 'sushi'
THEN PRICE * 20
WHEN PRODUCT_NAME != 'sushi'
THEN PRICE * 10
END ) as Points,
FROM SALES
INNER JOIN MENU
ON SALES.PRODUCT_ID = MENU.PRODUCT_ID
GROUP BY CUSTOMER_ID
-- 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?
WITH C AS
(SELECT SALES.CUSTOMER_ID, PRODUCT_ID, ORDER_DATE, JOIN_DATE,
CASE
WHEN DATEDIFF('days', JOIN_DATE:: DATE, ORDER_DATE ) <=7
AND DATEDIFF('days', JOIN_DATE:: DATE, ORDER_DATE ) >= 0
THEN 1
WHEN DATEDIFF('days', JOIN_DATE:: DATE, ORDER_DATE ) > 7
OR DATEDIFF('days', JOIN_DATE:: DATE, ORDER_DATE ) < 0
THEN 0
END as when_order,
FROM SALES
INNER JOIN MEMBERS
ON SALES.CUSTOMER_ID = MEMBERS.CUSTOMER_ID)
SELECT C.CUSTOMER_ID, SUM(PRICE),
SUM(CASE
WHEN when_order = 1
THEN PRICE * 20
WHEN when_order = 0 and PRODUCT_NAME = 'sushi'
THEN PRICE * 20
WHEN when_order = 0 and PRODUCT_NAME != 'sushi'
THEN PRICE * 10
END ) as Points,
FROM C
INNER JOIN MENU
ON C.PRODUCT_ID = MENU.PRODUCT_ID
WHERE ORDER_DATE < DATE('2021-02-01' )
GROUP BY C.CUSTOMER_ID
-- Bonus Question 1. Join all things
SELECT S.CUSTOMER_ID, S.ORDER_DATE, M.PRODUCT_NAME, M.PRICE,
CASE
WHEN JOIN_DATE > ORDER_DATE
OR JOIN_DATE IS NULL
THEN 'N'
WHEN JOIN_DATE <= ORDER_DATE
THEN 'Y'
END as member,
FROM MENU as M
INNER JOIN SALES as S
ON S.PRODUCT_ID = M.PRODUCT_ID
LEFT JOIN MEMBERS as M2
ON S. CUSTOMER_ID = M2.CUSTOMER_ID
-- Bonus Question 2. Rank all things
WITH C AS (SELECT S.CUSTOMER_ID, S.ORDER_DATE, M.PRODUCT_NAME, M.PRICE,
CASE
WHEN JOIN_DATE > ORDER_DATE
OR JOIN_DATE IS NULL
THEN 'N'
WHEN JOIN_DATE <= ORDER_DATE
THEN 'Y'
END as member,
FROM MENU as M
INNER JOIN SALES as S
ON S.PRODUCT_ID = M.PRODUCT_ID
LEFT JOIN MEMBERS as M2
ON S. CUSTOMER_ID = M2.CUSTOMER_ID)
SELECT *,
CASE WHEN member = 'N'
THEN NULL
ELSE DENSE_RANK() OVER(PARTITION BY C.CUSTOMER_ID, member ORDER BY ORDER_DATE)
END as ranking
FROM C