I have these below 5 tables and I am trying to find customers that ordered from the same category they clicked. With a condition where order date should be greater than the click date
Table: customers
email cid
a@gmail.com 1001
b@gmail.com 1002
c@gmail.com 1003
Table : orders
cid pid order_date
1001 4000 Aug-1-2021
1002 5000 Aug-1-2021
1003 4000 Aug-1-2021
Table : clicks
cid pid click_date
1001 4000 Jul-1-2021
1002 8000 Jul-1-2021
1003 8000 Jul-1-2021
Table : product
pid category_id
4000 1
8000 2
5000 2
Table : dim
categorty_id category
1 Games
2 Books
3 Music
Expected results
email cid category_clicked category_ordered
a@gmail.com 1001 games games
b@gmail.com 1002 books books
c@gmail will be excluded because he ordered a different category than the one he clicked. I am not able to get how to fetch the data based on the category. I was only able to write a query to fetch if customers bought the same item they clicked. Any help is appreciated. This is the query i have to find exactly what customer clicked & bought the same pid.
select distinct cust.email
From customers cust
Join orders o
on cust.cid=o.cid
join clicks c
on c.cid=o.cid and c.pid=o.pid
Join product prod
ON c.pid=prod.pid
inner join dim dim
on dim.category_id=prod.category_id
where o.order_date>=c.click_date
Advertisement
Answer
1. t1: join between the customers table and the orders and product
2. t2: join between the customers table and the clicks and product
3. result join t1 to t2 with t1.cid = t2.cid and t1.categorty_id = t2.categorty_id
4. join t1 to dim
select t1.email, t1.cid, dim.category as category_clicked, dim.category as category_ordered
From
(select cust.*,o.pid,o.order_date,prod.categorty_id
from customers cust
Join orders o on cust.cid=o.cid
Join product prod on o.pid=prod.pid) t1
join (select cust.*,c.pid,c.click_date,prod.categorty_id
from customers cust
Join clicks c on cust.cid=c.cid
Join product prod on c.pid=prod.pid ) t2
on t1.cid = t2.cid and t1.categorty_id = t2.categorty_id
join dim on dim.categorty_id= t1.categorty_id
where t2.click_date <= t1.order_date;
demo in db<>fiddle