统计每月订单数量并生成折线图
2017-07-06 19:13
381 查看
数据库内生成订单时的时间格式是这样的:
这里使用Yii1.1框架
1、先在 include/components 下封装了一个执行sql工具类 :ExecSql.php 和 拼接数据的工具类:GetCharsData.phpExecSql.php代码:
<?php /*** * @执行 sql 类。 */ class ExecSql { //@执行sql方法【获取所有】 public static function All($sql){ //@获得数据库对象 $connection = Yii::app()->db; //@执行传递过来的sql return $connection->createCommand($sql)->queryALL(); } //@执行sql方法【获取第一条】 public static function One($sql){ //@获得数据库对象 $connection = Yii::app()->db; //@执行传递过来的sql return $connection->createCommand($sql)->queryRow(); } }
GetCharsData.php代码:
<?php /*** * @拼接图表所需数据类。 */ class GetCharsData { /*** * @array 拼接的数据 * @获取 Highcharts 所需数据格式 */ public static function getHighData($rows){ //按照每年的格式区分数据 $new_row=array(); foreach ($rows as $r){ $year=substr($r['months'],0,4); $new_row[$year][]=$r; } unset($rows); //将区分的数据拼接成客户端使用的格式 $new_arr=array(); foreach ($new_row as $key=>$val){ $count=''; foreach ($val as $v){ $count.=','.$v['count']; } $new_arr[$key]='['.substr($count,1).']'; } unset($new_row); $data=''; foreach ($new_arr as $newk=>$newv){ $data.=',{name: \''.$newk.'年\', data: '.$newv.'}'; } unset($new_arr); //返回拼接好的数据。 return $data; } /*** * @array 操作的数据 * @获取数据对应的月份 */ public static function getTime($rows){ //获取每条数据的月份 $time=array(); foreach ($rows as $r){ $time[]=substr($r['months'],5,2); } //@返回筛选好的数据 return empty($time)?'':'[\''.implode('\',\'',array_unique($time)).'\']'; } }
2、订单统计控住器:CountController.php
<?php class CountController extends JController { //@订单统计模块 public function actionOrder(){ //@默认三个月数据 $begin=date('Y-m-d',strtotime("-3 month")); $end=date('Y-m-d',time()); //@订单数据sql $sql='select DATE_FORMAT(create_time,\'%Y-%m\') months,count(id) count from `order` where create_time >= \''.$begin.'\' and create_time <= \''.$end.'\' group by months order by months'; //@执行sql $rows=ExecSql::All($sql); //调用拼接数据方法。 $data=GetCharsData::getHighData($rows); $view['count']=count($rows); //渲染页面 $this->render('order',array( 'data'=>substr($data,1), 'time'=>GetCharsData::getTime($rows), 'view'=>$view, )); } //@订单搜索模块 public function actionOrderpost(){ //@判断如果没有选择开始时间 if(empty($_POST['start'])){ $this->error('开始时间不得为空~'); die; } //@如果是提交 if($_POST){ //@过滤数据 $start=isset($_POST['start'])?htmlentities(htmlentities($_POST['start'])):''; $end=isset($_POST['end'])?htmlentities(htmlentities($_POST['end'])):''; //@如果开始时间大于结束时间 if(strtotime($start)>strtotime($end)&&!empty($end)){ $this->error('开始时间不得大于结束时间~'); die; } //@默认条件 $where=' where'; //@如果选择了开始时间 if(!empty($start)){ $view['start']=$start; $where.=' create_time >= \''.$start.'\''; } //@如果选择了结束时间 if(!empty($end)){ $view['end']=$end; $where.=' and create_time <= \''.$end.'\''; } //@拼接sql $sql='select DATE_FORMAT(create_time,\'%Y-%m\') months,count(id) count from `order`'.$where.' group by months order by months'; //执行 sql 语句 $rows=ExecSql::All($sql); //调用拼接数据方法。 $data=GetCharsData::getHighData($rows); $view['count']=count($rows); //渲染页面 $this->render('order',array( 'data'=>substr($data,1), 'time'=>GetCharsData::getTime($rows), 'view'=>$view, )); //@销毁变量 unset($rows); die; } } }
3、展示订单折线图页面代码:
<div class="formbody"> <div id="usual1" class="usual" > <form id="companyForm" action="/count/orderpost" method="post" > <ul class="seachform1" style="width:100%;"> <li> <div class="vocation"> 下单时间:<input type="text" class="scinput" id="start" readonly="readonly" name="start" value="<?php if(isset($view['start'])){echo $view['start'];}?>" > -- <input type="text" class="scinput" id="end" readonly="readonly" name="end" value="<?php if(isset($view['end'])){echo $view['end'];}?>" > </div> </li> <li> <label> </label> <input name="submit" type="submit" class="scbtn" value="统计"/> </li> </ul> </form> <hr style="width: 100%;height: 1px;border: 1px solid #c2ccd1;margin-bottom: 30px;margin-top: 10px;"/> <?php if($view['count']==0){ ?> <p style="text-align:center;font-weight: bold;font-size: 24px;color: red;" class="p_style"> 没有您想要的数据,请重新尝试~ </p> <?php }else{ ?> <div id="container" style="min-width:400px;height:400px"></div> <?php }?> </div> </div> <script src="https://img.hcharts.cn/jquery/jquery-1.8.3.min.js"></script> <script src="https://img.hcharts.cn/highcharts/highcharts.js"></script> <script src="https://img.hcharts.cn/highcharts/modules/exporting.js"></script> <script src="https://img.hcharts.cn/highcharts-plugins/highcharts-zh_CN.js"></script> <script> $(function () { Highcharts.setOptions({ credits:{ enabled:false } }); $('#container').highcharts({ chart: { type: 'line' }, title: { text: '折线图' }, subtitle: { text: '单位(单)' }, xAxis: { categories: <?php echo $time; ?> }, yAxis: { title: { text: '' } }, plotOptions: { line: { dataLabels: { enabled: true // 开启数据标签 }, enableMouseTracking: false // 关闭鼠标跟踪,对应的提示框、点击事件会失效 } }, series: [ <?php echo $data; ?> ] }); }); </script>
效果图:
结束。
相关文章推荐
- 统计报表柱状图,折线图生成
- 按月统计订单数量报表SQL语句(CASE 和DECODE的使用)
- 统计报表柱状图,折线图生成
- JS 统计报表柱状图,折线图生成
- mysql 以天为单位 统计订单数量
- php web下订单编号的生成(隐藏订单上面的统计信息)
- Scrapy爬取hupu论坛标题统计数量并生成wordcloud
- 随机生成小写字母并统计每个字母的数量
- 统计今天一天的订单数量
- mysql 以天为单位 统计订单数量
- oracle 统计每天新增订单数量
- mysql 生成随机时间 mysql 统计数量并根据最后面一个数据的时间排序
- mysql 统计每个门店 每天 每月 每年 的订单 消费总额
- oralce -根据日期字段查询一年中每月某项的统计数量
- 47_ElasticSearch cardinality去重算法以及每月销售品牌数量统计
- 使用jfreechart统计数据,生成折线图(坐标x,y值大小可以自己设置)
- 对一篇英文短文进行统计排序(标点不考虑)。生成这样的结果: 整理出现的26(也可能不足26)个字母,根据字母出现的数量由多到少排序。若数量相同则按照字母表顺序列。 生成的结果大致为“ffffffffffffffffffffeeeeeeerrrrrrzzzzzzaaabbccu”。
- Redis统计某个时间段订单数量(用Guava缓存辅助解决)
- 概率论与数量统计(二)2___ 随机事件与概率
- 获取memcached缓存对象数量,统计在线用户数据量