領導提出一個簽收率需求,想要通過數據庫達到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個代碼運行后如下:
寫出來,感覺超爽