案例1.
/*Columns of Table members:
member_id bigint(255) PK 会员id
gender varchar(255) 性别
age int(255) 年龄
city varchar(255) 所在城市
name varchar(255) 姓名
phone bigint(255) 手机号码
registration_date date 注册日期
Columns of Table product:
Product_ID varchar(255) PK 产品id
Base_Category varchar(255) 产品大类
Category varchar(255) 产品小类
Price float(255,0) 产品价格
Columns of Table push:
camp_id bigint(255) PK 推送活动id
camp_name varchar(255) 推送活动名称
drop_dt date 推送日期
Cost float(255,0) 推送成本
Columns of Table push_detail:
promo_id bigint(255) 推送id(一个推送活动包含多个推送)
member_id bigint(255) 会员id
camp_id bigint(255) 推送活动id
read_date date 阅读日期
read_flag varchar(255) 是否阅读
like_date date 点赞日期
like_flag varchar(255) 是否点赞
Columns of Table sales:
transaction_id bigint(255) PK 交易记录id
member_id bigint(255) 会员id
product_id varchar(255) 产品id
shop_name varchar(255) 门店名称
amount float(255,0) 交易金额
transaction_date date 交易日期
quant int(255) 交易数量
city varchar(255) 交易城市
delivery_city varchar(255) 目标运达城市
问题:哪些微信推送活动给我们带来了好的销售业绩,有比较好的效果?
分析思路:
1.明晰业务逻辑:通过微信推送,提高活动曝光量,转化购买
2.明确指标体系:
定义“微信推送带来的销售业绩”:每一个用户在阅读完活动推送24h内产生的购买,sales.transaction_date < push_detail.read_date + 1
定义“好的效果”:用活动ROI评判,不考虑商品成本的情况下,ROI=销售总额/推送活动成本
3. 取数思路:
1)连接push表、push detail表和sales表,
2)筛选sales.transaction_date < push_detail.read_date + 1
3)按camp_id分组,ROI降序排列
4)查询camp_id和计算ROI
语句书写如下:
USE xiaozao;
SELECT p.camp_id
,SUM(amount)/Cost AS GOI
FROM push_detail pd
JOIN sales s USING (member_id)
-- ON pd.member_id = s.member_id
JOIN push p USING (camp_id)
-- ON p.camp_id = pd.camp_id
WHERE s.transaction_date < pd.read_date + 1
GROUP BY camp_id
ORDER BY GOI DESC
案例2.
*/Columns of Table sony_members:
member_id bigint(255) PK 会员id
gender varchar(255) 性别
age int(255) 年龄
city varchar(255) 城市
name varchar(255) 姓名
phone bigint(255) 电话
registration_date date 注册日期
Member_value int(255) 会员积分
Member_level varchar(255) 会员等级
channel varchar(255) 注册渠道
Marriage varchar(255) 是否已婚
Have_child varchar(255) 是否有小孩
Columns of Table sony_product:
Product_ID varchar(255) PK 产品id
Base_Category varchar(255) 产品大类
Category varchar(255) 产品小类
Price float(255,0) 产品单价
Columns of Table sony_sales:
transaction_id bigint(255) PK 交易号
member_id bigint(255) 购买id
product_id varchar(255) 产品id
shop_name varchar(255) 商场名称
amount float(255,0) 交易金额
transaction_date date 交易日期
quant int(255) 交易数量
city varchar(255) 交易城市
delivery_city varchar(255) 目标送达城市
问题:请将提供的数据导入到MySQL中,并试图回答下列问题
(1) 所提供数据中,销售最好的产品分别是哪些?
(2) 会员和非会员在购买金额和产品类别方面,有什么主要区别?
(3) 不同注册渠道的会员,在购买金额和产品类别方面有什么主要区别?
(1)解:
USE xiaozao;
-- (1)所提供数据中,销售最好的产品分别是哪些?
-- 思路:按产品分组求和排序
SELECT product_id
,SUM(amount) AS total_amt
FROM sony_sales
GROUP BY product_id
ORDER BY total_amt DESC
LIMIT 10;
(2)解:
-- (2)会员和非会员在购买金额和产品类别方面,有什么主要区别?
-- 思路:1)销售表连接产品表、和左连接会员表。
-- 2)按照要查询的源字段购买id、商品品类进行分组聚合
-- 3)用CASE WHEN按照购买id是否存在于会员表的会员id来判断是不是会员,添加会员标签(Yes/No)
-- 4)查询购买id、商品品类、购买总额和会员标签
USE xiaozao;
SELECT DISTINCT s.member_id
,p.Base_Category
,p.Category
,SUM(s.amount) AS total_amount
,CASE WHEN m.member_id IS NULL THEN 'No' ELSE 'Yes' END AS member_flag
FROM sony_sales s
JOIN sony_product p USING (product_id)
LEFT JOIN sony_members m USING (member_id)
GROUP BY s.member_id, p.Base_Category, p.Category
ORDER BY total_amount DESC;
/*可以看到购买金额排在前面的多数标签为Yes,是会员,从表中也能看出多数购买者都是会员
会员多数购买花费在PS4和数码相机及电视,非会员多数购买花费为耳机和数码相机*/
题(3)解:
-- (3)不同注册渠道的会员,在购买金额和产品类别方面有什么主要区别?
-- 思路:1)销售表连接会员表、产品表
-- 2)按照注册渠道、产品类别分组
-- 3)查询注册渠道、计算购买总额、查询产品类别
USE xiaozao;
SELECT m.channel
,p.Base_Category
,p.Category
,SUM(s.amount) AS total_amt
FROM sony_sales s
JOIN sony_members m USING (member_id)
JOIN sony_product p USING (product_id)
GROUP BY m.channel,p.Base_Category
,p.Category
ORDER BY m.channel, total_amt DESC
本人MySQL小白,刚学一个多月。如果解的不对,希望大家能指出。或者大家对题目有不同理解,欢迎探讨~