领导提出一个签收率需求,想要通过数据库达到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查询思路与过程(涉及百分比和四舍五入)的更多相关文章

  1. SQL 查询的执行过程

    所述内容均来自互联网,文章仅作为学习笔记,备忘使用. 有时候我在想我们总是在谈优化,FA 优化结构.优化框架.优化程序…,可是我真的了解将要进行的操作[优化]吗?以最近我的工作-优化SQL为例,我真的 ...

  2. sql查询语句解析过程--根据网络资料整理

    查询语句: (8)SELECT(9)DISTINCT(11)<TopNum> <selectlist> (1)FROM<left_table> (3)<joi ...

  3. SQL查询关于相对路径、矢代、绝对路径、递归、计算列的速度对比跟优化-SOD群记录

    1秒查原本递归的查询. 适用于:上下级.多层查询 -- Get childs by parent id WITH Tree AS ( SELECT Id,ParentId FROM dbo.Node ...

  4. 大数据学习day20-----spark03-----RDD编程实战案例(1 计算订单分类成交金额,2 将订单信息关联分类信息,并将这些数据存入Hbase中,3 使用Spark读取日志文件,根据Ip地址,查询地址对应的位置信息

    1 RDD编程实战案例一 数据样例 字段说明: 其中cid中1代表手机,2代表家具,3代表服装 1.1 计算订单分类成交金额 需求:在给定的订单数据,根据订单的分类ID进行聚合,然后管理订单分类名称, ...

  5. mysql经纬度查询并且计算2KM范围内附近用户的sql查询性能优化实例教程

    之前很傻很天真地以为无非就是逐个计算距离,然后比较出来就行了,然后当碰到访问用户很多,而且数据库中经纬度信息很多的时候,计算量的迅速增长,能让服务器完全傻逼掉,还是老前辈的经验比我们丰富,给了我很大的 ...

  6. springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetomany

    springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetoma ...

  7. 多表查询思路、navicat可视化软件、python操作MySQL、SQL注入问题以及其他补充知识

    昨日内容回顾 外键字段 # 就是用来建立表与表之间的关系的字段 表关系判断 # 一对一 # 一对多 # 多对多 """通过换位思考判断""" ...

  8. 【T-SQL基础】01.单表查询-几道sql查询题

    概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...

  9. 一个有趣的 SQL 查询(查询7天连续登陆)

    一个有趣的 SQL 查询 一个朋友有这样一个SQL查询需求: 有一个登录表(tmp_test),包含用户ID(uid)和登录时间(login_time).表结构如下: . row ********** ...

  10. 大数据技术之_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 ...

随机推荐

  1. R5_ES读写流程

    基本概念 refresh:es接收数据请求时先存入ES进程中的内存 Buffer ,默认每隔一秒(index.refresh_interval:1s)会从内存buffer中将数据写入 os cache ...

  2. P3193 [HNOI2008] GT考试 题解

    之前学矩阵乘的时候做的题,当时因为不会\(kmp\)搜索一稀里糊涂过去了,现在填个坑. 头图 是\(Logos\)! P3193 [HNOI2008] GT考试 题链:洛谷 题库 题目大意: 求有多少 ...

  3. 7月 Splashtop上线了这些新功能 快来看鸭

    经过我们的攻城狮天天努力,我们的软件又得到了升级和完善,上线了一些有用的新功能和增强功能,快来看看吧. Splashtop已为Splashtop Business Access,Splashtop远程 ...

  4. linux下RPM工具的使用:RPM安装/查询/查看/卸载/升级软件包

    目录 一.关于软件包 二.RPM软件包 三.RPM包通用的命名规则 四.RPM工具的使用 4.1 rpm安装软件的功能 4.2 rpm查询的功能 4.3 rpm查看软件包内容是否被修改 4.4 rpm ...

  5. c++ 记一次把qrencode源码生成动态库的尝试

    在网上搜二维码库:qrencode,源码下载:https://github.com/fukuchi/libqrencode 我的是windows环境,IDE是vs2022. 建立一个动态库的空工程. ...

  6. 深入剖析Arthas源码

    一. 前言 Arthas 相信大家已经不陌生了,肯定用过太多次了,平时说到 Arthas 的时候都知道是基于Java Agent的,那么他具体是怎么实现呢,今天就一起来看看. 首先 Arthas 是在 ...

  7. Vue cli之项目打包

    在项目根目录中执行如下命令: npm run build 注:Vue脚手架打包的项目必须在服务器上运行,不能直接双击运行: 在打包之后项目中出现 dist 目录,dist 目录就是 Vue脚手架项目的 ...

  8. 用.NET代码生成JSON Schema 验证器

    问题 对于验证复杂JSON数据是否合法的需求,通常的解决方式是标准JSON Schema,.Net下有对应的JSON Schema实现库.应用程序通常需要将标准JSON schema传入实现库,来做后 ...

  9. [机器学习] 低代码机器学习工具PyCaret库使用指北

    PyCaret是一个开源.低代码Python机器学习库,能够自动化机器学习工作流程.它是一个端到端的机器学习和模型管理工具,极大地加快了实验周期,提高了工作效率.PyCaret本质上是围绕几个机器学习 ...

  10. mysql备份实战

    1.备份恢复演练(mysqldump+binlog) 知识储备 如下内容.. 全量备份 全量数据,指的是某一整个数据库(如kings)中所有的表.以及表数据,进行备份. 例如备份所有数据库.以及所有数 ...