tp5查出年度数据报表 记录一下坑
- 需求 根据 姓名 和 年份 获取 该 account 的 该年所有月份的 报表数据 (月份,排名,费用,全年费用)
1. 用传过来得到年份查询该年份12个月数据
第一反应 一个月一个月查嘛 虽然只传了一个年份 数据库里 时间 字段的数据类型是 date
所以存在表里的 时间是 yyyy-mm-dd 格式的 只查询 某年月的 肯定就要模糊查询 该年月的数据然后统计下
我的方法// 首先 得到前端传的 姓名 和 年份$name = input('name');$year = input('year', date("Y")); // 根据 年月模糊查询 肯定要个准确滴嘛 yyyy-mm 格式for ($i = 1; $i <= 12; $i++) {一开始是直接遍历的时候 拼接 后面发现 模糊查询年月 2021-1 要写成 2021-01 所以.....// 加了个这个if 判断 看起来很蠢但是一时又没想到其他方法if ($i < 10) {$date = $year . '-0' . $i;} else {$date = $year . '-' . $i;}// 先查个 全年总费用出来$total_year_fee = Db::table('tm_order_report_date')->alias('ord')->join("tm_account a ", "ord.account_id=a.id and a.name = '{$name}'")->leftJoin("system_user u", "u.id=a.admin_id")->field("a.name as name,a.id as account_id,u.nick as team_name,sum(ord.order_num) as order_num,sum(ord.bi_ci_fee) as total_bi_ci_fee")->group('name')->whereTime('order_date', 'year')->select();// 这个 whereTime('order_date', 'year') 是默认查本年的if (!empty($total_year_fee)) {$this_month_details['total_bi_ci_fee'] = $total_year_fee[0]['total_bi_ci_fee'];} // 查出该人该月的详细信息$this_month_details['data'][$i] = Db::table('tm_order_report_date')->alias('ord')->join("tm_account a ", "ord.account_id=a.id and a.name = '{$name}'")->leftJoin("system_user u", "u.id=a.admin_id")->field("a.name as name,u.nick as team_name,sum(ord.order_num) as order_num,sum(ord.bi_ci_fee) as total_bi_ci_fee")->group('name')->where('ord.order_date', 'like', '%' . $date . '%')->select();// 查出该人该月的 排名$this_month_rank = Db::table('tm_order_report_date')->alias('ord')->join("tm_account a ", "ord.account_id=a.id and a.admin_id > 0 and {$this->exadmin}")->field("a.name as name,sum(ord.order_num) as order_num,sum(ord.bi_ci_fee) as total_bi_ci_fee")->group('name')->where('ord.order_date', 'like', '%' . $date . '%')->order(['total_bi_ci_fee' => 'desc'])->select();// 遍历一下把 排名插到 详细信息里面foreach ($this_month_rank as $key => &$value) {$value['no'] = ($key + 1);if ($value['name'] == $name) {$this_month_details['data'][$i]['rank'] = $value['no'];}}// 再遍历一下 将 没查出来的月份的数据 给0 不然会不显示(特殊需求) ?!!foreach ($this_month_details['data'] as $key => &$tmd) {if (empty($tmd)) {$tmd[0]['order_num'] = 0;$tmd[0]['total_bi_ci_fee'] = 0;$this_month_details['data'][$i]['rank'] = 0;}}}// for 循环完了吧 返回输出给前端...... 看一眼就知道这效率....杠杠的....烂... // 无能本人只能为实现效果写出垃圾代码 折磨 数据库 , 网络 ,还有前端......
return json(['data' => $this_month_details]);
无奈返回给前端的json太恶心和变态… 虽然还是
修改后的方法!!!!!!!!!!!!
$name = _input_('name', 'empty', '业务员姓名必传');$year = input('year', date("Y"));$total_year_fee = Db::table('tm_order_report_date')->alias("d")->join("tm_account a ", "a.id=d.account_id")->where(['a.name' => $name])->where("d.order_date", "like", $year . "%")->sum("d.bi_ci_fee");$total_year_fee = round($total_year_fee / 10000, 2); //单位万元这部分内容 与 之前的步骤大致 都是取出总费用 接下来........!!!$data = Db::table("tm_order_report_date")->alias("d")->join("tm_account a ", "a.id=d.account_id")->leftJoin("system_user u", "u.id=a.admin_id")->where(['a.name' => $name])->where("d.order_date", "like", $year . "%")->field("a.name,u.email as team,sum(d.bi_ci_fee) as bi_ci_fee,sum(d.order_num) as order_num,left(d.order_date,7) as month")->group("DATE_FORMAT(d.order_date,'%Y-%m')")->order("month asc")->select();模糊查询是有的 但是有个特殊的地方 left(d.order_date,7) as month mysql的left函数 放入两个参数 一个是 时间字段 一个是 7 再加上 ->group("DATE_FORMAT(d.order_date,'%Y-%m')")直接分组查询出 yyyy-mm-dd 字段前7位一样 不就刚好是某年某月的数据吗并且 ->order("month asc") 根据年份 排序 直接 1-12月乖溜站好.// 最后来个遍历 把数据拍好 并加上个月份$ret_data = [];for ($i = 1; $i <= 12; $i++) {foreach ($data as $k => $v) {$month = substr($v['month'], 5, 2);if (intval($month) == $i) {$v['bi_ci_fee'] = round($v['bi_ci_fee'] / 10000, 2);$ret_data[$i] = ['month' => $i, 'name' => $v['name'], 'team' => $v['team'], 'bi_ci_fee' => $v['bi_ci_fee'], 'order_num' => $v['order_num']];}}if (!isset($ret_data[$i])) {$ret_data[$i] = ['month' => $i, 'name' => $v['name'], 'team' => $v['team'], 'bi_ci_fee' => 0, 'order_num' => 0];}}$ret_data = array_values($ret_data); // 返回数据 一气呵成 还有 排名去掉了 排名过于麻烦 又不需要了....return json(['total_year_fee' => $total_year_fee, 'data' => $ret_data]);
果然 这样前端可以少掉些头发了 而且效率杠杠的
总结1下.
MySQL left()函数的使用
https://blog.csdn.net/weixin_30412847/article/details/113213382
https://blog.csdn.net/moakun/article/details/82086078
https://blog.csdn.net/weixin_30745553/article/details/101970198
- 根据传过来的 姓名 和 月份 查出该月每天的数据 (日期,排名,费用,全年费用)
2. 根据传过来的姓名和月份查出该月每天的数据
同样的 第一反应 传一个月份 得到年月 再得到该月的总天数 做遍历的次数 每次遍历拼接一下 年-月-日(第几次)作为查询的条件 上code
老样子 先接收一下参数 name 和 month$name = _input_('name', 'empty', '业务员姓名必传');$year = input('year', date("Y"));$month = _input_('month', 'empty', '月份参数没有传');又要判断一下传的月份拼接成 yyyy-mm-dd if ($month < 10) {$date = $year . '-0' . $month;} else {$date = $year . '-' . $month;} 一个特殊必要的方法 获取该年月到底有多少天 function get_day($date){$tem = explode('-', $date); //切割日期 得到年份和月份$year = $tem['0'];$month = $tem['1'];if (in_array($month, array('1', '3', '5', '7', '8', '01', '03', '05', '07', '08', '10', '12'))) {// $text = $year.'年的'.$month.'月有31天';$text = '31';} elseif ($month == 2) {if ($year % 400 == 0 || ($year % 4 == 0 && $year % 100 !== 0)) //判断是否是闰年{// $text = $year.'年的'.$month.'月有29天';$text = '29';} else {// $text = $year.'年的'.$month.'月有28天';$text = '28';}} else {// $text = $year.'年的'.$month.'月有30天';$text = '30';}return $text;}得到的该月天数 就是遍历的次数 上遍历for ($i = 1; $i <= $this->get_day($date); $i++) {if ($i < 10) {$ymd = $date . '-0' . $i;} else {$ymd = $date . '-' . $i;}// 今日数据排行$day_details[$i] = Db::table('tm_order_report_date')->alias('ord')->join("tm_account a ", "ord.account_id=a.id and a.name = '{$name}'")->leftJoin("system_user u", "u.id=a.admin_id")->field("a.name as name,sum(ord.order_num) as order_num,sum(ord.bi_ci_fee) as total_bi_ci_fee")->group('name')->where('ord.order_date', 'like', '%' . $ymd . '%')->select();// 今日数据排行$day_range = Db::table('tm_order_report_date')->alias('ord')->join("tm_account a ", "ord.account_id=a.id and a.admin_id > 0 and {$this->exadmin}")->field("a.name as name,sum(ord.order_num) as order_num,sum(ord.bi_ci_fee) as total_bi_ci_fee")->group('name')->where('ord.order_date', 'like', '%' . $ymd . '%')->order(['total_bi_ci_fee' => 'desc'])->select();// 为了得到当日排名 查出当时排行名称相同的排名即排序foreach ($day_range as $key => &$value) {$value['no'] = ($key + 1);if (strcmp($value['name'], $name) == 0) {$day_details[$i][0]['date'] = substr($ymd, 5);$day_details[$i][0]['rank'] = $value['no'];}}// 再把没查到的是空的 字段都给个0显示下foreach ($day_details as $key => &$dd) {if (empty($dd)) {$day_details[$key][0]['order_num'] = 0;$day_details[$key][0]['rank'] = 0;$day_details[$key][0]['total_bi_ci_fee'] = 0;$day_details[$i][0]['date'] = substr($ymd, 5);}}}OK了 输出数据 -_-||-_-||-_-|| huangdeyipireturn json(['data' => $day_details]);
数据出是出来了 效率低 而且 前端也难处理… OMG
改tmd 改 改 改 思路: 可以先查出一直年月的数据 根据 年月日字段排序 和 统计总费用 再遍历插入数组666
$name = _input_('name', 'empty', '姓名必传');$year = input('year', date("Y"));$month = _input_('month', 'empty', '月份参数没有传');sprintf() 方法 %02s 2s 将month写成前面0填充的两位字符串$month = $year . '-' . sprintf("%02s", $month);直接联表查询 根据年月 根据日期大小排序 查询出该月的所有数据 并统计总费用$data = Db::table("tm_order_report_date")->alias("d")->join("tm_account a ", "a.id=d.account_id")->where(['a.name' => $name])->where("order_date", "like", $month . "%")->field("sum(bi_ci_fee) as bi_ci_fee,sum(order_num) as order_num,order_date")->group("order_date")->order("order_date asc")->select();老方法 获取 该年月总天数$days = $this->get_day($month);$ret_data = [];遍历插入 数据 substr($v['order_date'], 8, 2); 把年月日 从第八位开始截取 2 位例如 2021-03-03 截取后就是 03 俺需要 从5截5 是 03-03 区分日期for ($i = 1; $i <= $days; $i++) {foreach ($data as $k => $v) {$day = substr($v['order_date'], 8, 2);// 如果遍历的日期数 和 次数相等 那就ok了 是当天的数据if (intval($day) == $i) {//$v['bi_ci_fee'] = round($v['bi_ci_fee'] / 10000, 2);$ret_data[$i] = ['day' => substr($v['order_date'], 5, 5), 'bi_ci_fee' => $v['bi_ci_fee'], 'order_num' => $v['order_num']];}}// 不存在就给0if (!isset($ret_data[$i])) {$ret_data[$i] = ['day' => substr($v['order_date'], 5, 5), 'bi_ci_fee' => 0, 'order_num' => 0];}}返回数组中所有的值(不保留键名):$ret_data = array_values($ret_data);return json(['data' => $ret_data]);大哥 搞腚 舒服了
PHP sprintf() 函数
PHP array_values() 函数
tp5查出年度数据报表 记录一下坑相关推荐
- 工程监测管理平台、工程数据看板、工程总览、动态模型、数据分析、数据跟踪、建筑工地、数据报表、警点管控、现场记录、观测记录、测点管理、模型管理、文档管理、墙体下沉、成员管理、axure原型、产品原型
工程监测管理平台.工程数据看板.工程总览.动态模型.数据分析.数据跟踪.建筑工地.数据报表.警点管控.现场记录.观测记录.测点管理.模型管理.文档管理.墙体下沉.成员管理.axure原型.产品原型 ...
- 在线云客服管理系统、会话管理、访客管理、客户管理、工单管理、会话记录、考勤统计、数据报表、工单设置、全局设置、转人工服务、自动回复、客户标签、客服监控、客服系统、前端会话、客服管理、在线客服、人工客服
在线云客服管理系统.会话管理.访客管理.客户管理.工单管理.会话记录.考勤统计.数据报表.工单设置.全局设置.转人工服务.自动回复.客户标签.客服监控.客服系统.前端会话.客服管理.在线客服 .人工客 ...
- 在线云客服管理系统、会话管理、访客管理、客户管理、工单管理、会话记录、考勤统计、数据报表、工单设置、全局设置、人工服务、自动回复、客户标签、客服监控、客服系统、前端会话、客服管理、在线客服 、人工客服
在线云客服管理系统.会话管理.访客管理.客户管理.工单管理.会话记录.考勤统计.数据报表.工单设置.全局设置.转人工服务.自动回复.客户标签.客服监控.客服系统.前端会话.客服管理.在线客服 .人工客 ...
- 用友u8年度账文件服务器错误,用友u8erp软件出纳管理模块年度数据结转常见问题...
用友u8erp软件也有单独的出纳管理模块,有关出纳管理模块年年度数据结转的问题今天小辣妹给大家总结一下. 问题现象:12月出纳模块不需结账,总账模块是否可以结账? 解决方案:建议出纳结账后再结总账!用 ...
- 你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(上)
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(下)
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 区块链相关数据报表_重磅|京东云区块链数据服务(BDS)正式开源
今天,"区块链+京东云 大有可为"战略合作媒体沟通会在北京国家会议中心召开.会上,京东云与京东数科宣布在区块链技术服务领域深度合作,重磅发布了智臻链"云"建设规 ...
- python抓取数据时失败_爬取数据缺失的补坑,Python数据爬取的坑坑洼洼如何铲平...
渣渣业余选手讲解,关于爬取数据缺失的补坑,一点点关于Python数据爬取的坑坑洼洼如何铲平,个人的一些心得体会,还有结合实例的数据缺失的补全,几点参考,仅供观赏,如有雷同,那肯定是我抄袭的! 在使用P ...
- 石油与天然气行业中数据报表分析
石油与天然气行业是一个系统性的行业,需要多学科,多专业,多领域结合才能达到最终使用的和完善,包含石油行业勘探与生产领域,炼油与化工领域,天然气与管道领域,销售领域,而每一个领域又可以划分很多明细如勘探 ...
最新文章
- wxpython dataview处理大量数据_38个常用Python库:数值计算、可视化、机器学习等8大领域都有了...
- 网络营销外包——网络营销外包专员浅析网站首页设计需要注意哪些
- python软件下载免费还是收费-为什么python最强大的IDE是收费的PyCharm?
- oracle中把函数的执行权限赋个某个用户
- 【论文解读】CVPR 2021 当之无愧的最佳论文奖:GIRAFFE,一种可控图像合成方法...
- 有状态的bean和无状态的bean的区别
- php如何设计自定义模型,php – Kohana ORM模型中的自定义方法
- 不得不说的wepapi 优化
- “萝莉变大妈”事件系主播策划!斗鱼出拳:永久封停!
- java interface_Java中的接口(interface)
- python 在Excel中新增一列
- 使开发更便捷——Visual Studio 使用技巧——快捷键
- Javascript 调用MSAgent(调用office助手显示动画)
- 荣耀 android 11 rom,华为荣耀10官方固件rom刷机包_华为荣耀10完整版系统升级包
- 利用gpu加速神经网络算法,为什么用gpu 模型训练
- 程序员简历项目经历怎么写 ?三条原则不可忽视 【项目案例分享】
- php 生成指定长度字符串
- Word支持的正则表达式
- 2021年美容师(高级)考试资料及美容师(高级)考试技巧
- java xtend_Java加上Xtend,满足你对C#语法的所有想象