用MYSQL分析网络销售案例

数据来源于某网站的销售统计,主要分为两部分:
1、网络订单数据;
2、用户信息。
数据来源:链接:https://pan.baidu.com/s/1urm8NR2hvlCsKK2Ip9uoTw
提取码:qj4b

阅读路线:

0、数据导入
1、不同月份的下单人数
2、用户三月份的回购率和复购率
3、统计男女用户的消费频次
4、统计多次消费用户,分析第一次和最后一次的消费间隔
5、统计不同年龄段用户的消费金额差异
6、统计消费的二八法则:消费top20%的用户贡献了多少消费额度

0、数据导入

1)通过workbench新建一个schema。

create schema data1;
  1. 导入以上两个表到data1中,并设置列的类型:
    order_info 表格如下设置:


    image.png
  • 设置orderID为主键,且不能为空值;
  • PaidTime为时间戳类型。

user_info按如下设置:


image.png
  • userID为主键,且不能为空;
  • Birth生日设置为DATE类型。

导入后各个表数据如下所示:


orderinfo数据结果

userinfo数据结果

1、不同月份的下单人数

思路:对orderinfo按月分组并对userID去重、计数。

select date_format(paidtime,'%Y-%c')as dtmonth,
count(distinct userID) as count_users
from orderinfo
where ispaid='已支付'
group by date_format(paidtime,'%Y-%c')

运算结果:


不同月份的下单人数

2、用户三月份的复购率和回购率

  • 复购率:自然月内,购买多次的用户占比
  • 回购率:曾经购买过的用户在某一时期内再次购买的占比
    2.1 用户复购率计算:
    首先,计算三月份每个用户的购买次数:
select userID,count(userID)as ct
from orderinfo
where month(paidtime)=3 and IsPaid='已支付'
group by userID

再嵌套个select函数,计算复购率:购买次数大于1的人数/购买总人数。

select count(if(t.ct>1,1,null)) /count(1)as 三月复购率
from(
select userID,count(userID)as ct
from orderinfo
where month(paidtime)=3 and IsPaid='已支付'
group by userID
) as t
用户三月份的复购率

三月份用户的复购率为30.87%
2.2 用户回购率计算
首先对数据进行过滤,将已支付的用户userID,支付日期月份筛选出来:

select userID,date_format(paidtime,'%Y-%m-01')as m
from orderinfo
where ispaid='已支付'
group by userID,date_format(paidtime,'%Y-%m-01')
image.png

采用date_sub函数,将上表与下月消费的userID进行表联结,即可筛选出本月消费的userID和下月回购的userID,即可计算每月的回购率:

select t1.m,
count(t1.m) as 消费总人数,
count(t2.m) as 回购人数,
count(t2.m)/count(t1.m) as 回购率
from
    (select userID,date_format(paidtime,'%Y-%m-01')as m
    from orderinfo
    where ispaid='已支付'
    group by userID,date_format(paidtime,'%Y-%m-01'))as t1
    left join
    (select userID,date_format(paidtime,'%Y-%m-01')as m
    from orderinfo
    where ispaid='已支付'
    group by userID,date_format(paidtime,'%Y-%m-01'))as t2
on t1.userID=t2.userID
and t1.m=date_sub(t2.m,interval 1 month)
group by t1.m


用户回购率的结果
  • 三月用户的回购率为23.94%

3、统计男女用户的消费频次

分析思路:将orderinfo和BVV
+userinfo进行表联结,并统计每个人的消费频次。

select userinfo.UserID,
userinfo.sex,
count(1)
from orderinfo
left join userinfo
on userinfo.userID=orderinfo.userID
where IsPaid='已支付'
and userinfo.sex <>''
group by userinfo.UserID

各用户消费频次统计

再对以上数据进行分组,对频次求均值即可求出男女用户的消费频次:

select t.sex,avg(t.ct) as 平均消费频次
from(
select userinfo.UserID,
userinfo.sex,
count(1) as ct
from orderinfo
left join userinfo
on userinfo.userID=orderinfo.userID
where IsPaid='已支付'
and userinfo.sex <>''
group by userinfo.UserID
) t
group by t.sex
男女用户的消费频次

4、统计多次消费用户,分析第一次和最后一次的消费间隔

通过datediff函数计算每个用户消费日期的最大值和最小值的间隔天数,过滤掉最大值和最小值相等的值,或者间隔天数为0的用户,即为多次消费用户第一次和最后一次的消费间隔:

select userID,datediff(max(paidtime),min(paidtime))as 消费间隔
from orderinfo
where orderinfo.ispaid='已支付'
group by userID
having max(paidtime)!=min(paidtime)
#or
having datediff(max(paidtime),min(paidtime))!=0
第一次和最后一次的消费间隔结果

5、不同年龄段的消费差异

首先通过表表联结的方式给不同用户划分年龄段,以10年为间隔进行划分,过滤掉出生日期为1900-00-00的异常值:

select orderinfo.*,ceil(timestampdiff(year,userinfo.birth,now())/10) as age
from orderinfo
left join userinfo
on orderinfo.userID=userinfo.userID
where orderinfo.ispaid='已支付'
and userinfo.birth>'1901-00-00'
年龄段划分结果
  • 时间差函数:TIMESTAMPDIFF(unit,begin,end); 根据单位返回时间差,对于传入的begin和end不需要相同的数据结构,可以存在一个为Date一个DateTime;unit可等于(year,quarter,week,day,hour,second,microsecond等);
    DATEDIFF(date1,date2) 函数返回两个日期之间的天数;
  • CEIL(X) 返回不小于X的最小整数值。(天花板)
    FLOOR(X) 返回不大于X的最大整数值。(地板)

再对以上年龄段分组求消费均值:

select t.age,avg(t.price)
from(
select orderinfo.*,ceil(timestampdiff(year,userinfo.birth,now())/10) as age
from orderinfo
left join userinfo
on orderinfo.userID=userinfo.userID
where orderinfo.ispaid='已支付'
and userinfo.birth>'1901-00-00'
) as t
group by t.age
order by avg(t.price)
不同年龄段的消费情况
  • 年龄在90-100之间的人均消费最高,达到了653.96元(不排除乱填信息的情况);
  • 各个年龄段人均消费较为平均,极差为120元。

6、统计消费的二八法则:消费top20%的用户贡献了多少消费额度

计算每个用户的消费总额并排序:

elect userID,sum(price)as sp
from orderinfo
where ispaid='已支付'
group by userID
order by sum(price) desc
用户消费总额排序结果

计算top20%的用户数:

select floor(count(1)*0.2)
from
(select userID,sum(price)as sp
from orderinfo
where ispaid='已支付'
group by userID
order by sum(price) desc )as t 
image.png

在源程序的基础上,计算top20%用户的消费总额:

select sum(t.sp) as sum_top20
from
(select userID,sum(price)as sp
from orderinfo
where ispaid='已支付'
group by userID
order by sum(price) desc limit 17192)as t 
top20%用户的消费总额

所有用户的消费总额:

select sum(price)
from orderinfo
所有用户的消费总额

top20%用户的消费总额占比情况:top20%用户的消费总额/所有用户的消费总额=73.93%
top20%的用户贡献了73.93%消费额度。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容