领导提出一个签收率需求,想要通过数据库达到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. Oracle用户创建、赋权、查询及删除操作

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...

  2. fastposter 2.5.0 全新发布 一款电商级海报生成器

    fastposter 2.5.0 全新发布 低代码海报生成器 fastposter低代码海报生成器,一分钟完成海报开发.支持Java.Python.PHP. Go.JavaScript等多种语言. v ...

  3. DB2 关联更新

    update GIS_TER_ADDRESS_MSG set (POS_X,POS_Y)=(select LAT,LON from TEMP_ATM where GIS_TER_ADDRESS_MSG ...

  4. 【译】使用 GitHub Copilot 作为你的编码 GPS

    GitHub Copilot 是一个改变游戏规则的人工智能助手,可以彻底改变您在 Visual Studio 中的编码流程.在我们的视频系列中,Bruno  Capuano 探讨了这个智能编码伙伴如何 ...

  5. Angular的管道

    Angular的管道可以看作成是一个数据格式化展示的工具.管道可以将数据格式化显示,而不改变源数据.获取数据可能简单到创建一个局部变量就行,也可能复杂到从WebSocket中获取数据流.一旦取到数据, ...

  6. PHP 网络通信底层原理分析

    一.引言 我们日常的程序开发大多数都是以业务为主,很少会接触到底层逻辑.对于我们程序员来说,了解程序的底层运行逻辑,更有助于提升我们对程序的理解.我相信大多数的人,每天基本上都是完成业务需求.当然,完 ...

  7. Django——自定义前端上传文件

    from django.db import models class Mytb(models.Model): file = models.FileField(upload_to='uploads/') ...

  8. lodash已死?radash库方法介绍及源码解析 —— 随机方法 + 字符串篇

    前言 大家好,我是阿瓜.一个励志想成为艾弗森的前端瓜 ~ 我们已经分享了 radash 库中数组.对象等相关的方法,大家感兴趣的可以前往主页查看阅读: 或许你最近在某个地方听过或者看过 radash ...

  9. 为什么SwiftUI使用struct, 限制使用class

    前言 在学习SwiftUI所有的地方,视图元素都定义一个struct并实现View协议,该协议定义body变量返回View类型. 但是为什么,这里一直是指定的struct, 而不是class呢? 尝试 ...

  10. 记一次bug排除心得

    问题背景 要做一个需求,大概是检测到某输入重启,于是写一个demo调试一下 c语言程序,交叉编译后在adb shell下运行 思路 用 am 命令直接重启 我们先手动验证一下,发现这个设备不支持am命 ...