数据分析小白实录(二)

    有志同道合的朋友,欢迎我们一起学习,互相帮助我的微信是tss2817411628. 

    这是我的一次学习数据分的项目实战,我在开始之前只掌握mysql的基本语句,然后就没看讲解视频直接自己按照问题写sql,结果废了很大功夫也没搞懂,所以我把这次六道题做一次总结,把我的代码发出来,老师的也发出俩,梳理两种代码的思路。自娱自乐,如果对你有帮助,不胜荣幸;如果你是前辈能指出我的问题,劳驾指出问题,我一定不胜感激!!!

    咱们开始~

    先看下表都有啥:

第一张表,订单信息。

第二张,顾客信息表


 userinfo  用户信息表

涉及表:

  orderinfo  订单详情表        userinfo  用户信息表

    | orderid  订单id                 | userid    用户id

    | userid    用户id                 | sex        用户性别

    | isPaid    是否支付             | birth      用户出生日期

    | price    付款价格

    | paidTime  付款时间

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


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


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


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

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

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

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

我的代码:

先按照月份进行分组,然后就可以统计订单数量了,注意同一用户可能会产生多个订单,所以要去重

select MONTH(paidTime),COUNT(DISTINCT userid) from orderinfo 

WHERE paidTime<>'0000-00-00 00:00:00' AND isPaid ='已支付'

GROUP BY MONTH(paidTime) ;


老师代码

select year(paidTime), month(paidTime), count(distinct userid) as cons 

from orderinfo 

where isPaid="已支付"and paidTime<>'0000-00-00 00:00:00' 

group by year(paidTime),month(paidTime);

老师的代码先过滤掉未支付和支付时间的脏数据,然后按照年月分组,在对年月分组中的客户进行去重聚合

错误代码

这是我写的一个错误代码

SELECT MONTH,COUNT(userid) as '订单人数'

FROM(

select *,MONTH(paidTime) as month

from orderinfo 

WHERE paidTime<>'0000-00-00 00:00:00' AND isPaid='已支付'

GROUP BY userid)a

GROUP BY MONTH;

代码结果显示3月份是对得上号,但是四月五月不对,为啥呢?

因为我的子查询是对用户进行聚合,如果a用户3月份消费且在四月也消费,那么分组时候只显示他在3月份的消费,四月份就不显示出来,那么最外面的select自然也统计不上了。比如说这个id=18347的客户

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

回购率:上月购买用户中有多少用户本月又再次购买

我的代码

SELECT COUNT(DISTINCT userid)/(

                SELECT count(DISTINCT userid)

                FROM orderinfo

                WHERE isPaid="已支付" AND MONTH(paidTime)=3)#这里是3月份消费人数


FROM orderinfo

WHERE userid IN(

                                SELECT  DISTINCT userid

                                FROM orderinfo

                                WHERE isPaid="已支付" AND MONTH(paidTime)=3)#这里是3月份消费的用户名单

AND isPaid="已支付" AND MONTH(paidTime)=4;#3月份消费的用户名单知道了,带进去4月份取比对,会选出3月份和4月份都消费的用户


最后用3月和4月都消费的人数和除以三月份消费人数(我觉得我的代码太长了,而且感觉笨笨的,能有人指点就好了)

老师的代码


#1、每个用户,每月的消费

#2、两个表联结,通过userid和b表的时间偏移(往前偏一个月)来联结

#3、然后在按月份分组前提下,汇总左边总次数和右边有次数,求回购率

SELECT MONTH(atime),COUNT(*),COUNT(userid2),COUNT(userid2)/COUNT(*) as huigou

FROM(

SELECT *

FROM( #1、每个用户,每月的消费

SELECT userid,DATE_FORMAT(paidTime,'%Y-%m-%01') as atime

FROM orderinfo

WHERE isPaid <>'未支付' AND paidTime <>'0000-00-00 00:00:00'

GROUP BY userid,atime)a

LEFT JOIN (

SELECT userid as userid2,DATE_FORMAT(paidTime,'%Y-%m-%01') as time

FROM orderinfo

WHERE isPaid <>'未支付' AND paidTime <>'0000-00-00 00:00:00'

GROUP BY userid2,time)b

ON  a.userid=b.userid2 AND atime=DATE_SUB(time,INTERVAL 1 MONTH)

#2、两个表联结,通过userid和b表的时间偏移(往前偏一个月)来联结

)c

GROUP BY atime;#3、然后在按月份分组前提下,汇总左边总次数和右边有次数,求回购率



#复购率:

#3月份的消费情况,显示每个用户的消费次数

SELECT *,COUNT(userid)

FROM orderinfo

WHERE isPaid ='已支付' AND MONTH(paidTime)=3

GROUP BY userid; #三月每个用户的购买情况以及次数


#用消费1次以上的用户除以消费总数

SELECT MONTH(paidTime),

SUM(IF(cs>1,1,0)),#如果买的次数大于1,记1

COUNT(cs),SUM(IF(cs>1,1,0))/COUNT(cs) as fugou 

FROM(

SELECT *,COUNT(userid) as cs

FROM orderinfo

WHERE isPaid ='已支付' AND MONTH(paidTime)=3

GROUP BY userid

)a; #用上一条结果作为表


老师的代码

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)="03"

      group by userid

  ) a;


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

我的代码

SELECT COUNT(*),

            SUM(IF(sex='男',1,0)) AS '男性购买数量',

            SUM(IF(sex='女',1,0)) AS '女性购买数量',

            SUM(IF(sex='男',1,0))/COUNT(*) AS '男生购买率',

            SUM(IF(sex='女',1,0))/COUNT(*) AS '女生购买流率'

FROM(

                SELECT a.userid,sex

                FROM orderinfo AS a

                INNER JOIN userinfo AS b ON a.userid=b.userid

                WHERE isPaid <>'未支付' AND  sex <>'' 

                GROUP BY a.userid   ##筛选出每个用户消费记录

)c;


我求的是男和女生的 占比


老师的代码

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) a

group by sex;


老师求的是男女生购买的平均数


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

我的代码

SELECT      userid,

                    MIN(paidTime),

                    MAX(paidTime),

                    DATEDIFF(MAX(paidTime),MIN(paidTime))

FROM orderinfo

WHERE isPaid <>'未支付'#筛选出有效支付记录

GROUP BY userid HAVING COUNT(userid)>1;#过滤掉消费一次的用户


老师的代码


select

  userid,

  min(paidTime),

  max(paidTime),

  datediff(max(paidTime), min(paidTime))

from orderinfo

where isPaid="已支付"

group by userid

having count(1)>1;

我和老师的代码差不多

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

#通过计算各年龄段人数,然后求各年龄段消费金额,然后求平均消费金额

#计算每个人年龄,然后根据userid聚合orderinfo

#筛掉脏数据并且对用户进行分组,同时计算每个用户的消费总金额!!!!(这个点卡了我好久)

#然后将上步结果作为子查询,计算各年龄段消费金额

SELECT age,avg(prices)'每个年龄段平均消费金额',AVG(ci)'每个年龄段平均消费次数'

FROM(

SELECT a.userid,SUM(price) as prices,COUNT(a.userid) AS ci,age#要在这里进行聚合每个用户的消费金额

FROM(

SELECT *,CEIL(TIMESTAMPDIFF(YEAR,birth,NOW())/10) as age

FROM userinfo

WHERE birth>'1901-00-00'

)a

INNER JOIN orderinfo AS b

ON a.userid=b.userid

WHERE isPaid<>'未支付'

GROUP BY a.userid

)c

GROUP BY age;


老师的代码

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>'1901-00-00') b

on a.userid=b.userid

group by a.userid,age) a

group by age;

老师代码的结果和我有点细小差别,但总体不影响


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


最后一题老师都是分开算的比较简单

我的代码

SELECT SUM(zj)/(

SELECT SUM(zzj)

FROM(

SELECT *,SUM(price) AS zj

FROM orderinfo

WHERE isPaid<>'未支付'

GROUP BY userid

ORDER BY SUM(price) DESC

)b

)

FROM(

SELECT *,SUM(price) AS zj

FROM orderinfo

WHERE isPaid<>'未支付'

GROUP BY userid

ORDER BY SUM(price) DESC

LIMIT 17000)a


老师的代码

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

select

  userid,

  sum(price) as total_price

from orderinfo a

where isPaid="已支付"

group by userid;

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

select

  count(1) as cons,

  sum(total_price) as all_price

from (select

  userid,

  sum(price) as total_price

from orderinfo a

where isPaid="已支付"

group by userid) a;

3、取出前20%的用户进行金额统计

select

  count(1) as cons,

  sum(total_price) as all_price

from (

select

  userid,

  sum(price) as total_price

from orderinfo a

where isPaid="已支付"

group by userid

order by total_price desc

limit 17000) b ;

        项目一前前后后一共做了三遍,三遍才能能掌握的比较透。每个题目我错在哪里,或者思路哪里不对,也学到了许多细节。很累,才开始也很难,尤其之前课程代码都非常简单,自己第一次独立做题,突然觉得好难,难得进行不下去,但是还是硬着头皮做,如今6道终于全部吃透,雨过天晴的感觉真好。

下面我罗列一下,我在这6道题中的一点收获。可能不对,抱着怀疑态度看吧。

取别名

在select 后面可以取别名,但是在参与筛选时候不可以使用别名。

比如你计算总消费金额 sum(price) as zj,如果后面用where筛选,只能写sum(price)>***,写sum(zj)>***,就会报错

有子查询的注意事项



做子查询时候的表中不能有命名相同的列

不然会报1060 - Duplicate column name 'userid'的错误

前路漫漫,继续加油

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

推荐阅读更多精彩内容