mysql 练习基础 11:行转列的方法
2021/10/17 2:09:51
本文主要是介绍mysql 练习基础 11:行转列的方法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
-- 数据准备 create database taobao; use taobao; create table UserBehavior( user_id int, item_id int, item_category int, behavior_type varchar(10), user_geohash varchar(10), times datetime, amount decimal(5,2) ); show variables like '%secure%';-- 查看安全路径,随后将表格粘贴到该安全路径下, load data infile "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/UserBehavior.csv" into table UserBehavior fields terminated by ',' ignore 1 lines; select * from UserBehavior limit 10; select count(*) from UserBehavior;#1048575 -- 数据清洗 -- 缺失值处理 select count(user_id), count(item_id), count(item_category), count(behavior_type), count(user_geohash), count(times), count(amount) from UserBehavior; -- 异常值检查 select min(times),max(times),min(amount),max(amount) from userbehavior; -- 重复记录处理 select distinct * from userbehavior; -- 字段处理:根据times字段增加计算字段用户行为日期、周和小时,排除后续分析不需要的user_geohash字段,并将筛选后的结果保存到新表 #保存方式一:直接导出表格csv文件 select user_id, item_id, item_category, behavior_type, date(times) as 日期, hour(times) as 小时, date_format(times,'%w') as 星期, amount from (select distinct * from userbehavior) as t #从去重的表里面去查询 limit 100; #保存方式二:代码保存(至安全路径) select user_id, item_id, item_category, behavior_type, date(times) as 日期, hour(times) as 小时, date_format(times,'%w') as 星期, amount from (select distinct * from userbehavior) as t limit 100 into outfile "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/t2.csv"-- 保存到安全路径并命名为t2 fields terminated by ',' lines terminated by '\r\n'; #保存方式三:视图 #视图:优点 1.简化SQL语句,快速提取,将复杂查询语句进行封装;2.安全,保护数据,设置访问权限 让不同级别用户看到不同的视图;缺点 操作视图比直接操作基础表要慢 create view userbehavior_new as select user_id, item_id, item_category, behavior_type, date(times) as 日期, hour(times) as 小时, date_format(times,'%w') as 星期, amount from (select distinct * from userbehavior) as t; select * from userbehavior_new limit 100; select count(*) from userbehavior_new;#962097 -- 数据预览 select count(distinct user_id) as 用户数, count(distinct item_id) as 商品数, count(distinct item_category) as 类目数 from userbehavior_new; select behavior_type, count(*) as 行为次数 from userbehavior_new group by behavior_type; -- 数据分析 -- 1.流量指标分析 -- 每日PV、UV、人均浏览量、成交量、销售额 select 日期, sum(behavior_type="pv") as 浏览量, count(distinct user_id) as 访客数, sum(behavior_type="pv")/count(distinct user_id) as 人均浏览量, sum(behavior_type="buy") as 成交量, sum(if(behavior_type="buy",amount,0)) as 销售额 from userbehavior_new group by 日期; -- 周一到周日PV、UV、人均浏览量、成交量、销售额 select 星期, sum(behavior_type="pv") as 浏览量, count(distinct user_id) as 访客数, sum(behavior_type="pv")/count(distinct user_id) as 人均浏览量, sum(behavior_type="buy") as 成交量, sum(if(behavior_type="buy",amount,0)) as 销售额 from userbehavior_new group by 星期; -- 每小时PV、UV、人均浏览量、成交量、销售额 select 小时, sum(behavior_type="pv") as 浏览量, count(distinct user_id) as 访客数, sum(behavior_type="pv")/count(distinct user_id) as 人均浏览量, sum(behavior_type="buy") as 成交量, sum(if(behavior_type="buy",amount,0)) as 销售额 from userbehavior_new group by 小时; -- 2.行为转化分析(转化率=当前行为用户数/上一行为用户数) select behavior_type, count(distinct user_id) as 用户人数, lag(count(distinct user_id),1) over(order by behavior_type desc) as 上一行为用户人数, ifnull(count(distinct user_id)/lag(count(distinct user_id),1) over(order by behavior_type desc),1) as 转化率 from userbehavior_new group by behavior_type; -- 浏览—加购—购买的转化率 select behavior_type, count(distinct user_id) as 用户人数, lag(count(distinct user_id),1) over(order by behavior_type desc) as 上一行为用户人数, ifnull(count(distinct user_id)/lag(count(distinct user_id),1) over(order by behavior_type desc),1) as 转化率 from userbehavior_new where behavior_type in ('pv','cart','buy') group by behavior_type; -- 每日浏览—加购—购买的转化率 # 行转列的方法 -- charlly 整理 select 日期, sum(if(behavior_type="pv",用户人数,0)) as 浏览人数, -- 用if条件判断将行转化成列,然后对其进行聚合 sum(if(behavior_type="cart",用户人数,0)) as 加购人数, sum(if(behavior_type="cart",用户人数,0))/sum(if(behavior_type="pv",用户人数,0)) as 浏览_加购转化率, sum(if(behavior_type="buy",用户人数,0)) as 购买人数, sum(if(behavior_type="buy",用户人数,0))/sum(if(behavior_type="cart",用户人数,0)) as 加购_购买转化率 from (select 日期, behavior_type, count(distinct user_id) as 用户人数 from userbehavior_new where behavior_type in ('pv','cart','buy') group by 日期, behavior_type) as t group by 日期; -- 每日浏览—加购—购买的转化率 老师答案 select 日期, sum(if(behavior_type='pv',用户人数,0)) as 浏览人数, sum(if(behavior_type='cart',用户人数,0)) as 加购人数, sum(if(behavior_type='buy',用户人数,0)) as 购买人数, sum(if(behavior_type='cart',用户人数,0))/sum(if(behavior_type='pv',用户人数,0)) as 浏览_加购转化率, sum(if(behavior_type='buy',用户人数,0))/sum(if(behavior_type='cart',用户人数,0)) as 加购_够买转化率 from (select 日期, behavior_type, count(distinct user_id) as 用户人数 from userbehavior_new where behavior_type in ('pv','cart','buy') group by 日期,behavior_type) as t group by 日期;
这篇关于mysql 练习基础 11:行转列的方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-07MySQL读写分离入门:轻松掌握数据库读写分离技术
- 2024-12-07MySQL读写分离入门教程
- 2024-12-07MySQL分库分表入门详解
- 2024-12-07MySQL分库分表入门指南
- 2024-12-07MySQL慢查询入门:快速掌握性能优化技巧
- 2024-12-07MySQL入门:新手必读的简单教程
- 2024-12-07MySQL入门:从零开始学习MySQL数据库
- 2024-12-07MySQL索引入门:新手快速掌握MySQL索引技巧
- 2024-12-06BinLog学习:MySQL数据库BinLog入门教程
- 2024-12-06Binlog学习:MySQL数据库的日志管理入门教程