mysql案例学习总结

案例: 使用mysql 进行数据分析
老师指路->https://www.jianshu.com/u/1f32f227da5f
使用工具:MySQL、Navicat

一、准备好订单数据和用户数据:

a、打开命令窗口或者 navicat 、workbench 等数据库软件
b、任意选择一个数据库,或者创建一个新的数据库并进入数据库

create database data charset utf8;
use data;

c、执行以下source 命令,注意改成自己的路径并且不能包含中文

#将.sql文件拖到命令行source后 即可显示文件路径
source C:\Users\data\Desktop\Mysql_case\orderinfo.sql
source C:\Users\data\Desktop\Mysql_case\userinfo.sql

注意:后面不需要加分号,上面的命令会把 **.sql 文件的语句都执行一遍

desc orderinfo;--显示表结构

select *  from orderinfo limit 10; #显示10条记录

select  count(*) from orderinfo;#显示记录条数

二、题目要求:

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

涉及表:
orderinfo 订单详情表
| orderid 订单id
| userid 用户id
| isPaid 是否支付
| price 付款价格
| paidTime 付款时间

userinfo 用户信息表
| userid 用户id
| sex 用户性别
| birth 用户出生日期

1、统计不同月份的下单人数

观察数据,过滤未支付数据,去重
不同月份下单人数

select year(paidTime)as year_ ,
month(paidTime) as month_ ,
count(distinct userid) as cons
from orderinfo 
where isPaid='已支付'
group by year(paidTime),month(paidTime);

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

三月份交易量

select count(orderid)as all_order from orderinfo  
where month(paidTime)=3;

三月份下单总人数

select 
count(distinct userid) as cons
from orderinfo 
where  month(paidTime)=3;

复购率:当月购买了多次用户占当月用户比例
回购率:上月购买用户中有多少用户本月又再次购买
(回购率:本月购买用户中有多少用户下个月又再次购买)
复购率:
a、先筛选出3月份消费情况

select 
*
from orderinfo
where isPaid='已支付'  and month(paidTime)=3;

b、统计每个用户在3月份消费了多少次

select 
userid, count(1) as cons
from orderinfo
where isPaid='已支付'  
and month(paidTime)=3

group by userid;

c、对购买次数进行判断,统计出消费多次的用户数(大于1次)
对用户购买次数进行判断,并sum求和,如果购买次数大于1,用户数加1
复购率:当月购买了多次用户占当月用户比例

select 

count(1) as userid_cons,
sum(if (cons>1,1,0)) as fugou_cons,
sum(if (cons>1,1,0))/count(1) as fugou_rate

from(select 
     userid,
     count(1) as cons
    from orderinfo
    where isPaid='已支付'  
    and month(paidTime)=3
    
    group by userid 
    ) a; 

回购率:本月购买用户中有多少用户下个月又再次购买
计算所有月份回购率
举例:三月份的回购率=3月用户中4月又再次购买的人数/3月用户总数
a、统计每年每月的用户消费情况

#分组:每个月 有哪些用户ID
select 
    userid,
    date_format(paidTime,'%Y-%m-01') as month_dt,
    count(1)  as cons

from orderinfo
where isPaid='已支付'
group by userid,date_format(paidTime,'%Y-%m-01');

b、相邻月份 进行关联,能关联上的用户为回购
自己与自己关联,用户对应,月份对应
此处使用left join ,保留用户总数;
inner join 会删掉关联不上的用户,三月用户总数会减少

select 
*
from(select 
    userid,
    date_format(paidTime,'%Y-%m-01') as month_dt,
    count(1)  as cons

from orderinfo
where isPaid='已支付'
group by userid,date_format(paidTime,'%Y-%m-01')
) a

left join (select 
    userid,
    date_format(paidTime,'%Y-%m-01') as month_dt,
    count(1)  as cons

from orderinfo
where isPaid='已支付'
group by userid,date_format(paidTime,'%Y-%m-01')


) b on a.userid=b.userid
and date_sub(b.month_dt,interval 1 month)=a.month_dt;

c、用统计出四月份有关联的 用户数据量 除以 三月份用户数据量
count(a.userid)>count(b.userid) 4月份有null情况

select 
    a.month_dt,
    count(a.userid),
    count(b.userid),
    count(b.userid)/ count(a.userid) as '回购率'

from(select 
    userid,
    date_format(paidTime,'%Y-%m-01') as month_dt,
    count(1)  as cons

from orderinfo
where isPaid='已支付'
group by userid,date_format(paidTime,'%Y-%m-01')

) a

left join (select 
    userid,
    date_format(paidTime,'%Y-%m-01') as month_dt,
    count(1)  as cons

from orderinfo
where isPaid='已支付'
group by userid,date_format(paidTime,'%Y-%m-01')


) b on a.userid=b.userid
and date_sub(b.month_dt,interval 1 month)=a.month_dt
group  by a.month_dt;

3、统计男女用户消费频次是否有差异

获取用户 性别 消费次数 男生用户消费总次数/男生人数
a、统计每个用户消费次数、带性别,筛选出性别不为空的用户

select   

a.userid,
sex,
count(1) as cons

from orderinfo a
inner join (select *  from userinfo where sex!='') b
on a.userid=b.userid
group  by a.userid,sex ;

b、对性别做一个消费次数平均计算

select 
    sex,
    avg(cons) as avg_cons
 
from(select   

a.userid,
sex,
count(1) as cons

from orderinfo a
inner join (select *  from userinfo where sex!='') b
on a.userid=b.userid
group  by a.userid,sex 
) c
group  by sex;

4、统计多次消费的用户,第一次和最后一次消费间隔是多少天

a、取出多次消费用户

select 
 userid
from orderinfo
 where isPaid='已支付'
 group by userid
 
 having count(1)>1;

b、取出第一次与第二次购物时间

计算时间差

select 
 
 userid,
 
 min(paidTime),
 max(paidTime),
 datediff(max(paidTime),min(paidTime)) as jiange

from orderinfo
where isPaid='已支付'
group by userid
 
having count(1)>1;

5、统计不同年龄段,用户的消费金额是否有差异

a、计算每个用户年龄,并对用户年龄进行分层
0-10:1 11-20:2 21-30:3 31-40 41-50 10岁为一层
ceil 向上取整

select 
userid,
birth,
now(),
ceil(timestampdiff(year,birth,now())/10) as age

from userinfo  
where  birth> '1900-01-01';

b、关联订单信息,获取不同年龄段的消费频次和消费数据

select 
  a.userid,
  age,
  count(1) as cons ,
  sum(price) as prices
from orderinfo a

inner join (
select 
userid,
birth,
now(),
ceil(timestampdiff(year,birth,now())/10) as age

from userinfo  
where  birth> '1900-01-01'

) b
on a.userid=b.userid
group by b.userid,b.age;

c、对不同年龄层 进行聚合 最终得到不同年龄层消费情况

select
age,
avg(cons),
avg(prices)

from (
select 
  a.userid,
  age,
  count(1) as cons ,
  sum(price) as prices

from orderinfo a

inner join (
select 
userid,
birth,
now(),
ceil(timestampdiff(year,birth,now())/10) as age

from userinfo  
where  birth> '1900-01-01'

) b

on a.userid=b.userid

group by b.userid,b.age
) c
 
group  by age ;

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

用户消费占比,20%用户 消费贡献占80%

a、统计每个用户消费金额,并进行降序排序

select 
userid,
sum(price) as total_prices

from orderinfo a

where  isPaid='已支付'
group  by userid 
order by total_prices desc ;

b、统计一共有多少用户,以及用户总消费金额

select

count(1) as cons,
sum(total_prices) as all_prices

from ( select 
userid,
sum(price) as total_prices

from orderinfo a

where  isPaid='已支付'
group  by userid  ) b;

c、取出消费前20%用户,进行金额统计
8万用户去20%-17000名

select 

count(1) as cons,
sum(total_prices) as all_prices

from (
select 
userid,
sum(price) as total_prices

from orderinfo a

where  isPaid='已支付'
group  by userid  

order by total_prices desc
limit 17000) b;

select (2.7/3.1);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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