计算订单签收率的sql查询思路与过程(涉及百分比和四舍五入)
领导提出一个签收率需求,想要通过数据库达到excel中表现的形式,提高计算速度和工作效率,
如下形式:

数据库中表数据结构:

部分数据如下:

sql语句思路如下:
-- 1.已签收:以物流反馈管道,状态分组,已签收出现的次数
select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='已签收' -- 2.拒收:
select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='拒收' -- 3.在途:
select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='在途' -- 4.未发货:
select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='未发货' -- 5.总计:各物流反馈管道出现的次数,即已签收+拒收+在途+未发货,即总计
select `直发签收率计算表`.`物流反馈管道`,count(`直发签收率计算表`.`物流反馈管道`) as '总计' FROM `直发签收率计算表` group by `直发签收率计算表`.`物流反馈管道` -- 6.各渠道签收率,签收/(签收+拒收),即签收/已完成
select y.`物流反馈管道`,y.count1/(y.count1+j.count2) as '签收/已完成'
from
(select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`)as count1 FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='已签收') y left join
(select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) as count2 FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='拒收') j on y.`物流反馈管道`=j.`物流反馈管道` -- 7.各渠道签收率,签收/(已签收+拒收+在途+未发货),即签收/总计
select y.`物流反馈管道`,y.county/z.countz as '签收/总计'
from
(select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`)as county FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='已签收') y left join
(select `直发签收率计算表`.`物流反馈管道`,count(`直发签收率计算表`.`物流反馈管道`) as countz FROM `直发签收率计算表` group by `直发签收率计算表`.`物流反馈管道`) z on y.`物流反馈管道` = z.`物流反馈管道` -- 8.各渠道签收率,(签收+拒收)/总计
select y.`物流反馈管道`,(y.county+j.countj)/z.countz as '已完成/总计'
from
(select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`)as county FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='已签收') y left join
(select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) as countj FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='拒收') j on y.`物流反馈管道`=j.`物流反馈管道` left join
(select `直发签收率计算表`.`物流反馈管道`,count(`直发签收率计算表`.`物流反馈管道`) as count0 FROM `直发签收率计算表` group by `直发签收率计算表`.`物流反馈管道`) z on y.`物流反馈管道` = z.`物流反馈管道` -- ---------------------------------------
-- 9.物流反馈管道签收率总表,不带百分号
select
y.`物流反馈管道`,y.county as '已签收',j.countj as '拒收',t.countt as '在途',w.countw as '未发货',z.countz as 'z总计',y.county/(y.county+j.countj) as '签收/已完成',
y.county/z.countz as '签收/总计',(y.county+j.countj)/z.countz as '已完成/总计'
from
(select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) as county FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='已签收') y left join
(select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) as countj FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='拒收') j on y.`物流反馈管道`=j.`物流反馈管道` left join
(select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) countt FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='在途' ) t on t.`物流反馈管道`=y.`物流反馈管道` left join
(select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) countw FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='未发货') w on w.`物流反馈管道`=y.`物流反馈管道` left join
(select `直发签收率计算表`.`物流反馈管道`,count(`直发签收率计算表`.`物流反馈管道`) countz FROM `直发签收率计算表` group by `直发签收率计算表`.`物流反馈管道`) z on z.`物流反馈管道`=y.`物流反馈管道`
-- ----------------------------------------------------------------------------------------------------
-- 10.物流反馈管道签收率总表,带百分号
select
y.`物流反馈管道`,y.county as '已签收',j.countj as '拒收',t.countt as '在途',w.countw as '未发货',z.countz as 'z总计',
concat(left(y.county/(y.county+j.countj)*100,5),'%') as '签收/已完成',
concat(left(y.county/z.countz*100,5),'%') as '签收/总计',
concat(left((y.county+j.countj)/z.countz*100,5),'%') as '已完成/总计'
from
(select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) as county FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='已签收') y left join
(select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) as countj FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='拒收') j on y.`物流反馈管道`=j.`物流反馈管道` left join
(select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) countt FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='在途' ) t on t.`物流反馈管道`=y.`物流反馈管道` left join
(select `直发签收率计算表`.`物流反馈管道`,`直发签收率计算表`.`状态`,count(`直发签收率计算表`.`状态`) countw FROM `直发签收率计算表`
group by `直发签收率计算表`.`物流反馈管道` ,`直发签收率计算表`.`状态` HAVING `直发签收率计算表`.`状态`='未发货') w on w.`物流反馈管道`=y.`物流反馈管道` left join
(select `直发签收率计算表`.`物流反馈管道`,count(`直发签收率计算表`.`物流反馈管道`) countz FROM `直发签收率计算表` group by `直发签收率计算表`.`物流反馈管道`) z
on z.`物流反馈管道`=y.`物流反馈管道`
-- 11.已签收,拒收,在途,未发货的总数:
-- 已签收总数
select count(`直发签收率计算表`.`状态`) as '已签收总数' FROM `直发签收率计算表` where `直发签收率计算表`.`状态`='已签收'
-- 拒收总数
select count(`直发签收率计算表`.`状态`) as '拒收总数' FROM `直发签收率计算表` where `直发签收率计算表`.`状态`='拒收'
-- 在途总数
select count(`直发签收率计算表`.`状态`) as '在途总数' FROM `直发签收率计算表` where `直发签收率计算表`.`状态`='在途'
---行列互换后:
-- 已签收,拒收,在途,未发货的总数
select
count(case when `直发签收率计算表`.`状态` = '已签收' then `直发签收率计算表`.`物流反馈管道` end) as '已签收总数',
count(case when `直发签收率计算表`.`状态` = '拒收' then `直发签收率计算表`.`物流反馈管道` end) as '拒收总数',
count(case when `直发签收率计算表`.`状态` = '在途' then `直发签收率计算表`.`物流反馈管道` end) as '在途总数',
count(case when `直发签收率计算表`.`状态` = '未发货' then `直发签收率计算表`.`物流反馈管道` end) as '未发货总数',
count(*) as '总计'
from `直发签收率计算表` -- 12.已签收,拒收,在途,未发货的总数,各比率均值
select '平均值总计',
count(case when `直发签收率计算表`.`状态` = '已签收' then `直发签收率计算表`.`物流反馈管道` end) as '已签收总数',
count(case when `直发签收率计算表`.`状态` = '拒收' then `直发签收率计算表`.`物流反馈管道` end) as '拒收总数',
count(case when `直发签收率计算表`.`状态` = '在途' then `直发签收率计算表`.`物流反馈管道` end) as '在途总数',
count(case when `直发签收率计算表`.`状态` = '未发货' then `直发签收率计算表`.`物流反馈管道` end) as '未发货总数',
count(*) as '总计',
count(case when `直发签收率计算表`.`状态` = '已签收' then `直发签收率计算表`.`物流反馈管道` end)/count(*) '签收/总数平均值',
count(case when `直发签收率计算表`.`状态` = '已签收' then `直发签收率计算表`.`物流反馈管道` end)/(count(case when `直发签收率计算表`.`状态` = '已签收' then `直发签收率计算表`.`物流反馈管道` end)
+count(case when `直发签收率计算表`.`状态` = '拒收' then `直发签收率计算表`.`物流反馈管道` end)) as '签收/已完成平均值',
(count(case when `直发签收率计算表`.`状态` = '已签收' then `直发签收率计算表`.`物流反馈管道` end)+count(case when `直发签收率计算表`.`状态` = '拒收' then `直发签收率计算表`.`物流反馈管道` end))/count(*) as '已完成/总计平均值'
from `直发签收率计算表`
-- ---------------------------- -- 13.已签收,拒收,在途,未发货的总数,各比率均值,分数以百分号形式
select '平均值总计',
count(case when `直发签收率计算表`.`状态` = '已签收' then `直发签收率计算表`.`物流反馈管道` end) as '已签收总数',
count(case when `直发签收率计算表`.`状态` = '拒收' then `直发签收率计算表`.`物流反馈管道` end) as '拒收总数',
count(case when `直发签收率计算表`.`状态` = '在途' then `直发签收率计算表`.`物流反馈管道` end) as '在途总数',
count(case when `直发签收率计算表`.`状态` = '未发货' then `直发签收率计算表`.`物流反馈管道` end) as '未发货总数',
count(*) as '总计',
concat(left(count(case when `直发签收率计算表`.`状态` = '已签收' then `直发签收率计算表`.`物流反馈管道` end)/count(*)*100,5),'%') as '签收/总数平均值',
concat(left(count(case when `直发签收率计算表`.`状态` = '已签收' then `直发签收率计算表`.`物流反馈管道` end)/(count(case when `直发签收率计算表`.`状态` = '已签收' then `直发签收率计算表`.`物流反馈管道` end)
+count(case when `直发签收率计算表`.`状态` = '拒收' then `直发签收率计算表`.`物流反馈管道` end))*100,5),'%') as '签收/已完成平均值',
concat(left((count(case when `直发签收率计算表`.`状态` = '已签收' then `直发签收率计算表`.`物流反馈管道` end)+count(case when `直发签收率计算表`.`状态` = '拒收' then `直发签收率计算表`.`物流反馈管道` end))/count(*)*100,5),'%') as '已完成/总计平均值'
from `直发签收率计算表`
-- 1.以改派表为例,四舍五入到万分位,物流反馈管道签收率总表,带百分号 select
y.`物流反馈管道`,y.county as '已签收',j.countj as '拒收',t.countt as '在途',w.countw as '未发货',z.countz as 'z总计',
concat(left(ROUND(y.county/(y.county+j.countj),4)*100,5),'%') as '签收/已完成',
concat(left(ROUND(y.county/z.countz,4)*100,5),'%') as '签收/总计',
concat(left(ROUND((y.county+j.countj)/z.countz,4)*100,5),'%') as '已完成/总计'
from
(select `改派签收率计算表`.`物流反馈管道`,`改派签收率计算表`.`状态`,count(`改派签收率计算表`.`状态`) as county FROM `改派签收率计算表`
group by `改派签收率计算表`.`物流反馈管道` ,`改派签收率计算表`.`状态` HAVING `改派签收率计算表`.`状态`='已签收') y left join
(select `改派签收率计算表`.`物流反馈管道`,`改派签收率计算表`.`状态`,count(`改派签收率计算表`.`状态`) as countj FROM `改派签收率计算表`
group by `改派签收率计算表`.`物流反馈管道` ,`改派签收率计算表`.`状态` HAVING `改派签收率计算表`.`状态`='拒收') j on y.`物流反馈管道`=j.`物流反馈管道` left join
(select `改派签收率计算表`.`物流反馈管道`,`改派签收率计算表`.`状态`,count(`改派签收率计算表`.`状态`) countt FROM `改派签收率计算表`
group by `改派签收率计算表`.`物流反馈管道` ,`改派签收率计算表`.`状态` HAVING `改派签收率计算表`.`状态`='在途' ) t on t.`物流反馈管道`=y.`物流反馈管道` left join
(select `改派签收率计算表`.`物流反馈管道`,`改派签收率计算表`.`状态`,count(`改派签收率计算表`.`状态`) countw FROM `改派签收率计算表`
group by `改派签收率计算表`.`物流反馈管道` ,`改派签收率计算表`.`状态` HAVING `改派签收率计算表`.`状态`='未发货') w on w.`物流反馈管道`=y.`物流反馈管道` left join
(select `改派签收率计算表`.`物流反馈管道`,count(`改派签收率计算表`.`物流反馈管道`) countz FROM `改派签收率计算表` group by `改派签收率计算表`.`物流反馈管道`) z
on z.`物流反馈管道`=y.`物流反馈管道` -- 2.以改派表为例,已签收,拒收,在途,未发货的总数,各比率均值,分数以百分号形式,四舍五入到万分位
select '平均值总计',
count(case when `改派签收率计算表`.`状态` = '已签收' then `改派签收率计算表`.`物流反馈管道` end) as '已签收总数',
count(case when `改派签收率计算表`.`状态` = '拒收' then `改派签收率计算表`.`物流反馈管道` end) as '拒收总数',
count(case when `改派签收率计算表`.`状态` = '在途' then `改派签收率计算表`.`物流反馈管道` end) as '在途总数',
count(case when `改派签收率计算表`.`状态` = '未发货' then `改派签收率计算表`.`物流反馈管道` end) as '未发货总数',
count(*) as '总计',
concat(left(ROUND(count(case when `改派签收率计算表`.`状态` = '已签收' then `改派签收率计算表`.`物流反馈管道` end)/count(*),4)*100,5),'%') as '签收/总数平均值',
concat(left(ROUND(count(case when `改派签收率计算表`.`状态` = '已签收' then `改派签收率计算表`.`物流反馈管道` end)/(count(case when `改派签收率计算表`.`状态` = '已签收' then `改派签收率计算表`.`物流反馈管道` end)
+count(case when `改派签收率计算表`.`状态` = '拒收' then `改派签收率计算表`.`物流反馈管道` end)),4)*100,5),'%') as '签收/已完成平均值',
concat(left(ROUND((count(case when `改派签收率计算表`.`状态` = '已签收' then `改派签收率计算表`.`物流反馈管道` end)+count(case when `改派签收率计算表`.`状态` = '拒收'
then `改派签收率计算表`.`物流反馈管道` end))/count(*),4)*100,5),'%') as '已完成/总计平均值'
from `改派签收率计算表`
其中第10个代码运行如下:

第13个代码运行后如下:

写出来,感觉超爽
计算订单签收率的sql查询思路与过程(涉及百分比和四舍五入)的更多相关文章
- SQL 查询的执行过程
所述内容均来自互联网,文章仅作为学习笔记,备忘使用. 有时候我在想我们总是在谈优化,FA 优化结构.优化框架.优化程序…,可是我真的了解将要进行的操作[优化]吗?以最近我的工作-优化SQL为例,我真的 ...
- sql查询语句解析过程--根据网络资料整理
查询语句: (8)SELECT(9)DISTINCT(11)<TopNum> <selectlist> (1)FROM<left_table> (3)<joi ...
- SQL查询关于相对路径、矢代、绝对路径、递归、计算列的速度对比跟优化-SOD群记录
1秒查原本递归的查询. 适用于:上下级.多层查询 -- Get childs by parent id WITH Tree AS ( SELECT Id,ParentId FROM dbo.Node ...
- 大数据学习day20-----spark03-----RDD编程实战案例(1 计算订单分类成交金额,2 将订单信息关联分类信息,并将这些数据存入Hbase中,3 使用Spark读取日志文件,根据Ip地址,查询地址对应的位置信息
1 RDD编程实战案例一 数据样例 字段说明: 其中cid中1代表手机,2代表家具,3代表服装 1.1 计算订单分类成交金额 需求:在给定的订单数据,根据订单的分类ID进行聚合,然后管理订单分类名称, ...
- mysql经纬度查询并且计算2KM范围内附近用户的sql查询性能优化实例教程
之前很傻很天真地以为无非就是逐个计算距离,然后比较出来就行了,然后当碰到访问用户很多,而且数据库中经纬度信息很多的时候,计算量的迅速增长,能让服务器完全傻逼掉,还是老前辈的经验比我们丰富,给了我很大的 ...
- springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetomany
springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetoma ...
- 多表查询思路、navicat可视化软件、python操作MySQL、SQL注入问题以及其他补充知识
昨日内容回顾 外键字段 # 就是用来建立表与表之间的关系的字段 表关系判断 # 一对一 # 一对多 # 多对多 """通过换位思考判断""" ...
- 【T-SQL基础】01.单表查询-几道sql查询题
概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...
- 一个有趣的 SQL 查询(查询7天连续登陆)
一个有趣的 SQL 查询 一个朋友有这样一个SQL查询需求: 有一个登录表(tmp_test),包含用户ID(uid)和登录时间(login_time).表结构如下: . row ********** ...
- 大数据技术之_19_Spark学习_03_Spark SQL 应用解析 + Spark SQL 概述、解析 、数据源、实战 + 执行 Spark SQL 查询 + JDBC/ODBC 服务器
第1章 Spark SQL 概述1.1 什么是 Spark SQL1.2 RDD vs DataFrames vs DataSet1.2.1 RDD1.2.2 DataFrame1.2.3 DataS ...
随机推荐
- kubernetes 存储流程
PV 与 PVC PVC (PersistentVolumeClaim),命名空间(namespace)级别的资源,由 用户 or StatefulSet 控制器(根据VolumeClaimTempl ...
- 12、web 中间件加固-apache 加固
1.账号设置 1.1.防止 webshell 越权使用 修改 httpd.conf:/etc/httpd/conf/httpd.conf 或编译路径下 /conf/httpd.conf 检查程序启动账 ...
- Dash 2.17版本新特性介绍
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master 大家好我是费老师,不久前Dash发布了其2.17.0版本,执行下面的命令进行最 ...
- linux的统计实现
场景: 将下面的数据里category里的分类统计计数 数据源 es_ip10000.json {"_index":"order","_type&qu ...
- iOS LLVM 中的宏定义
在阅读 Objc 库源码时常常会遇到很多宏定义,比如宏 SUPPORT_INDEXED_ISA.SUPPORT_PACKED_ISA,代码如下所示: // Define SUPPORT_INDEXED ...
- zabbix使用
安装部署6.0版本 获取仓库 https://www.zabbix.com/cn/download?zabbix=6.0&os_distribution=centos&os_versi ...
- 在线电子表格编辑器 Luckysheet
下载地址 不知道地址正不正经,我先用着,网上找的地址,不知道是不是可信任的,疑似官网的两个地址都打不开, https://github.com/dream-num/Luckysheet zip包 h ...
- vue2遇到的一些错误
一.VUE中的VUEX如何调用modules里面的mutations和state ...mapMutations("workflow",['setApproverConfig' ...
- HTML——标签元素的两大类
块级标签(block) – 独占一行 内联标签(inline) – 按文本内容占位 div标签和span标签 <div>只是一个块级元素,并无实际的意义.主要通过CSS样式为其赋予不同的表 ...
- SpringBoot自定义注解失效原因(2022-10-3)
长话短说,我负责的是一个多模块项目,接手的时候没有注意 @ComponentScan 注解的扫描范围,所以打包的时候,没有扫到我新加包. 所以,重点检查下 @ComponentScan 注解的范围