某电商数据分析:利用SQL做查询分析

2023-11-18

本文利用MYSQL在数据分析中的作用,将数据导入NAVICAT,对某电商展开数据分析工作:

一、理解数据

 

 字段说明:

(1)orderinfo表
        1、orderid:订单编号
        2、userid:用户编号
        3、isPaid:订单状态,是否已支付
        4、price:价格
        5、paidTime:支付时间

(2)userinfo表
        1、userid:用户编号
        2、sex:性别
        3、birth:出生日期

二、提出问题

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

三、代码实现

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

select 
 year(paidTime) as '年份'
 ,month(paidTime) as '月份'
 ,count(distinct userid) as '人数'
from orderinfo
where paidTime != '0000-00-00 00:00:00' and isPaid = '已支付'
group by year(paidTime),month(paidTime)

 对年和月做分组统计,得到数据样本2016年3月下单人数54799人,4月43967人,5月6人。

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

 复购率:当月购买了多次的用户占当月用户的比例

select 
  count(1) as '3月用户'
 ,sum(if(cons>=2,1,0)) as '3月复购人数'
 ,concat(sum(if(cons>=2,1,0))*100/count(1),'%') as '3月复购人数占比' 
from (select 
		userid
		,count(1) as cons
	  from orderinfo 
	  where paidTime != '0000-00-00 00:00:00'
	  and isPaid = '已支付'
	  and year(paidTime) = 2016 
	  and month(paidTime) = 3
	  group by userid) a

首先对3月用户进行分组统计,计算消费次数,对消费次数大于1的用户计算为复购人数,最后得到3月用户54799人,3月复购人数16916人,3月复购人数占比30.87%。

3、统计用户三月份的回购率

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

select
  a.month_dt
  ,count(a.userid) as '当月购买人数'
  ,count(b.userid) as '回购人数'
  ,concat(count(b.userid)*100 / count(a.userid),'%') as '回购率'
from (select
       userid,
       date_format(paidTime,'%Y-%m-01') as month_dt
      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
          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;

首先对用户编号和年月做分组统计,然后将得到的结果按相邻月份条件做左自连接,这样有回购的就能连接成功,没有回购的为null值,再利用count忽略null值的特性,统计回购人数和购买人数,最后得到各月购买人数、回购人数和回购率。

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

select
 sex
 ,avg(cons) as '平均消费频次'
from (select 
		a.userid
		,sex
		,count(1) as cons
	  from orderinfo a
	  inner join userinfo b
	  on a.userid = b.userid
	  where sex != ''
	  group by  a.userid ) a
GROUP BY sex

 首先统计每个用户的消费次数,然后对性别再做一个消费次数平均计算,最后得到女性平均消费频次1.9459次,男性1.9312次。

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

select 
 userid
 ,min(paidTime) as '第一次消费时间'
 ,max(paidTime) as '最后一次消费时间'
 ,datediff(max(paidTime), min(paidTime)) as '消费间隔'
from orderinfo
where isPaid="已支付"
group by userid
having count(1)>=2;

 

  按用户编号做分组统计,筛选出多次消费的用户,然后取出第一次和最后一次的时间,在做时间差。

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

select
 age
 ,avg(prices) as '平均消费金额'
 ,avg(cons) as  '平均消费频率'
from (select 
	   a.userid
	   ,age
	   ,count(*) as cons
	   ,sum(price) as prices #先求单个用户的总消费,先sum再avg
      from (select
             userid
            ,birth
            ,now()
	        ,timestampdiff(year,birth,now()) 
            ,ceil(timestampdiff(year,birth,now())/10) as age
           from userinfo 
           where birth>'1900-00-00'
            ) a
           inner join orderinfo b 
           on a.userid = b.userid
           group by a.userid,age
      ) a
group by age
order by age

 

首先计算每个用户的年龄,并对年龄进行分层:0-10为1,11-20为2,21-30为3,以此类推。然后关联订单信息,获取不同年龄段的一个消费频次和消费金额,最后再对年龄分层进行聚合,得到数据样本不同年龄层的消费情况。

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

select
 count(*)
 ,sum(sum_p)
 ,concat(sum(sum_p)*100/(select
						 sum(price) as total_sum
						from orderinfo
                        where isPaid="已支付"),'%') as '20%用户消费占比'
from (select
       userid
      ,sum(price) as sum_p
     from orderinfo
     where isPaid="已支付"
     group by userid
     order by sum_p desc
     limit 17000) a

 首先统计每个用户的消费金额,并降序排序 ,再统计一共有多少用户,以及总消费金额是多少,取出前20%的用户进行金额统计,最后得到前20%的用户贡献了85%的消费额。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

某电商数据分析:利用SQL做查询分析 的相关文章

  • SQL - 需要查找重复记录但排除反向事务

    我有一张交易表 偶尔会有 重复条目 如果 当管理员发现这些重复条目时 他们将撤销交易 从而创建负值 但由于监管要求 原始重复条目仍然保留 我想创建一个 SQL 查询 并使用 Crystal Reports 来制作报告 以便管理员轻松查找重复
  • AWS RDS MySql - 如何在设置“公开可用”后允许访问

    刚刚使用默认设置和用户 密码创建了新的 AWS RDS MySql 实例 我也将其设置为publicly available并在此过程中创建新的 VPC 目前无法从我的笔记本电脑连接到此 RDS mysql h endpoint u myu
  • 无法在 mysql-apt-config [Ubuntu 14.04] 中选择“确定”

    我使用的是 Ubuntu 14 04 sudo apt get update总是给我这个选项来配置 mysql apt config 我尝试选择版本 按 tab gt 在 确定 上突出显示的键 按 Enter 但没有任何反应 它再次返回并突
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 在同一查询中选择 Count of ip 和 Count of DISTINCT ip

    我有一个这样的表结构 TABLE NAME counter id datetime url ip 1 2013 04 12 13 27 09 url1 ip01 2 2013 04 13 10 55 43 url2 ip02 3 2013
  • 如何在查询语句之外从mysql查询中获取值?

    这是下面的函数console log function quo value value connection query SELECT role from roles where id 1 function error results fi
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • SQL Server使用in关键字传递字符串数组查询

    我认为 IN 子句不能接受具有多个值的绑定参数 Oracle 不能 需要几分钟 查询是 declare setting varchar max set setting Sales Entry Grid Cursor Customer Man
  • 可以有一个带有可变列的表吗?

    这可能是一个愚蠢的问题 但这里是 是否可以创建一个能够包含具有可变列数和自定义列名称的行的动态表 我浏览过 EAV 建模 但看起来很沉重 现实生活中的例子可能是这样的 假设我有一个客户登记册 但每个客户可能需要输入不同的信息 根据您要输入的
  • MVCC 如何与 MySql 中的 Lock 配合使用?

    我知道Mysql中使用锁或者MVCC可以实现并发控制 比如可重复读 但我不知道MVCC如何避免幻读 在其他地方了解到一般是通过MVCC和Gap Lock来实现的 但是目前我理解的是MVCC不需要锁 即更新和删除都是使用undo log来实现
  • MySQL正则表达式:如何将字符串中的数字与\d匹配?

    我有一个专栏release date它以字符串格式存储日期 不是 DATETIME 格式 因为它们有时可以是任何其他字符串文字 我想根据给定的月份和年份查找任意日期的所有记录 尝试遵循但对我不起作用 gt Post find all con
  • 如何删除 MySQL 数据库?

    你可能从我的上一个问题中注意到一个问题引发了更多的问题 在 MySQL 监视器中阅读 MySQL 手册 https stackoverflow com questions 1081399 我的数据库现在无法使用 部分原因是我想破坏东西并且无
  • MySql 视图脚本中的注释

    可以这样做吗 我尝试过多个 gui mysql workbench navicat toad for mysql 但没有一个保存这样的注释 something important select something else importan
  • Ruby ActiveRecord 和 sql 元组支持

    ActiveRecord 是否支持 where 子句中的元组 假设底层数据库支持 结果 where 子句看起来像这样 where name address in John 123 Main St I tried Person where n
  • MySQL“列计数与第 1 行的值计数不匹配”是什么意思

    这是我收到的消息 ER WRONG VALUE COUNT ON ROW 列计数与第 1 行的值计数不匹配 这是我的全部代码 我的错误在哪里 DROP TABLE student CREATE TABLE employee emp id I
  • MySQL:如何仅获取正值的平均值?

    假设我有 INT 列 并且我使用 1 来表示插入时没有可用数据 我想获得该列中所有 0 或更大值的平均值 这可能吗 Thanks 我忘了提及 我正在与其他 AVG 一起执行此操作 因此从选项卡中选择 avg a avg b avg d 所以
  • 计算2个日期之间每个日期的记录数

    我必须创建一个查询来返回多轴图表的结果 我需要计算为 2 个日期之间的每个日期创建的 ID 数量 我试过这个 DECLARE StartDate datetime2 7 11 1 2020 EndDate datetime2 7 2 22
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • 总和和不同不会改变结果?

    我是一个新手 试图在这里解决这个问题 到目前为止还没有运气 非常感谢任何帮助 Select Distinct AB agency no ab branch no AS AGENCY BRANCH count AB agency no ab
  • rake db 问题:迁移 -

    我无法为 Ruby on Rails 设置 MySQL 数据库 设置数据库并确保 config database yml 文件匹配后 我遇到了以下错误消息 U Rails alpha gt rake db migrate trace in

随机推荐

  • chatgpt赋能python:Python如何优化中文SEO

    Python如何优化中文SEO Python 作为一种流行的编程语言 可以用来开发各种不同的应用程序 当涉及到网络营销和搜索引擎优化 SEO 时 Python的功能也非常有用 在本篇文章中 我们将介绍如何使用Python来优化中文SEO 以
  • opencv显示对比

    在opencv中我们一般都要展示处理前后图像的对比 有时候我们会imshow两次来展示两张图片 那为什么我们不放在一个图片里呢 这样显然是更加优雅的模式 上代码 Mat combineImage Mat before Mat after a
  • Go语言实现Onvif客户端:4、配置网络信息

    Go语言实现Onvif客户端 4 配置网络信息 文章目录 Go语言实现Onvif客户端 4 配置网络信息 1 思路 2 代码 上一节获取到网络接口token后 就可进行一些网络配置了 这里我们暂时只实现进行ip地址的配置接口和封装 1 思路
  • 【SpringCloud】pom.xml文件解析

    本文档为本人学习交流所用 参考原文档 https www cnblogs com hoyong articles 13034270 html 1 pom xml是什么 pom是Project Object Model 项目对象模型 的缩写
  • 虚表

    虚表 虚函数表 C 中 一个类存在虚函数 那么编译器就会为这个类生成一个虚函数表 在虚函数表里存放的是这个类所有虚函数的地址 虚表从属于类 编译器会为包含虚函数的类加上一个成员变量 该成员变量是一个指向虚函数表的指针 因此虚表指针是一个成员
  • UE4安卓打包配置(大陆内网络整顿后,Android打包时AndroidWorks无法使用的解决方法)

    由于国内进行了网络整顿 UE4官网上用CodeWorksforAndroid下载安卓打包工具配置的方法已经不能使用了 开了VPN也链接不上 这使得用UE4打包配置安卓游戏变得非常麻烦 博主捣鼓了好几天才打包成功 深感在中国学习UE4的艰难与
  • 力扣-图解算法数据结构-剑指 Offer 05. 替换空格

    题目要求 力扣题解 代码 program mydemo description 剑指 Offer 05 替换空格 author Mr zeng create 2021 03 05 11 04 public class Solution1 p
  • @escook/request-miniprogram基于 Promise 的小程序网路请求库

    安装 npm install escook request miniprogram 导入 按需导入 http 对象 import http from escook request miniprogram 将按需导入的 http 挂载到 wx
  • 静态资源存放的位置

    存放的四个位置 classpath META INF resources classpath resources classpath static classpath public 如果要访问的话 是当前项目的根路径 静态资源名 因为这个图
  • C#中浮点数的比较

    前几天去面试 被问到怎么比较两个浮点数的大小 当时只说了个大概 看得出来面试官不是太满意 回来特意查了一下 在MSDN上发现了比较浮点数是否相等的不错的方法 Initialize two doubles with apparently id
  • 接口测试用例设计 - 实战篇

    目录 一 接口测试流程 二 分析接口文档中哪些元素 三 如何设计接口测试用例 3 1 为什么要设计测试用例 3 2 设计接口测试用例从哪些方面考虑 四 常用的接口测试用例覆盖方法 五 接口测试的接口优先级 5 1 优先级 针对所有接口 5
  • MATLAB代码显示内存不足的解决方法

    总结了下大家对于运行MATLAB代码 显示内存不足的问题 在网上进行调研 总结如下 一般out of memenry存在以下几种情况 1 变量需要的存储空间超过了可用的内存空间 2 数据需要的存储空间 超过内存中最大的可用连续存储空间 3
  • 最大子列和问题【简单易懂】

    问题 给定N个整数的序列 求函数的最大值 算法一 例如序列为 1 2 3 4 所以子列分别为 1 1 2 1 2 3 1 2 3 4 2 2 3 2 3 4 3 3 4 4 我们要做的就是依次将这些子列的和求出并比较 得出最大子列和 首先将
  • 2020算法设计与分析 官方考前模拟卷 参考答案

    算法设计与分析 样例试题 算法设计与分析总结笔记 注 此试题仅供了解题型 和期末考试试题没有任何直接关系 FBI Warning 这套题难度较大 千万不要坏了心态 xj大佬说要是考试那么难他直播粪坑蝶泳 Power By 王宏志教授 5 分
  • matlab的tfdata函数_matlab 入门基本操作命令与函数

    一 tf 函数 是传递函数的意思 一般学自动控制原理的时候经常用 在s域中 比如你要输入G s 1 s 2 2s 1 就可以在matlab中输入G tf 1 1 2 1 就OK了 不懂的话你可以在command窗口输入help tf 就行了
  • 为什么使用start方法启动Java的Thread线程?

    一 简介 在Java代码当中 当我们需要开启子线程去处理一些任务的时候 往往是调用Thread对象的start方法 这样Thread实例中的Runnable对象的run方法就会在一个新的线程当中执行 创建一个线程 Thread thread
  • 从注意力机制到Vison Transformer

    原视频链接 https www bilibili com video BV1Jh411Y7WQ spm id from 333 788 vd source f04f16dd6fd058b8328c67a3e064abd5 https www
  • 【Zabbix实战之运维篇】Zabbix的客户端自动注册配置

    Zabbix实战之运维篇 Zabbix的客户端自动注册配置 一 自动注册与自动发现介绍 1 自动注册介绍 2 自动发现介绍 3 主动模式与被动模式 二 客户端安装abbix agent2 1 下载zabbix agent2软件包 2 安装z
  • Python 设计真实反弹球算法及原理分析 (使用物理定律)

    文章简单地使用物理定律 编写程序模拟真实世界中的碰撞 在开始正式讲解之前 先看这两个代码 把球掉头 ball speed 0 ball speed 0 ball speed 1 ball speed 1 可以看到 这个代码直接把球的速度反了
  • 某电商数据分析:利用SQL做查询分析

    本文利用MYSQL在数据分析中的作用 将数据导入NAVICAT 对某电商展开数据分析工作 一 理解数据 字段说明 1 orderinfo表 1 orderid 订单编号 2 userid 用户编号 3 isPaid 订单状态 是否已支付 4