MySQL实战案例练习

案例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小白,刚学一个多月。如果解的不对,希望大家能指出。或者大家对题目有不同理解,欢迎探讨~

你可能感兴趣的:(mysql)