計算訂單簽收率的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個代碼運行后如下:

寫出來,感覺超爽

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM