mysql高级进阶:php语句操作mysql进行最大值、最小值、平均值和中位数的报表导出方案
原创
©著作权归作者所有:来自51CTO博客作者漏刻有时的原创作品,请联系作者获取转载授权,否则将追究法律责任
项目需求
- 求不同产品名称价格的最大值、最小值、平均值和中位数;
代码分解
最大值、最小值、平均值
在mysql中直接调用min()、max()、avg()函数,使用按产品名称分组统计即可实现;但是中位数,需要自己二次封装自定义函数
$sql = "select cat_name,MIN(pro_price) AS lowest,MAX(pro_price) AS highest,AVG(pro_price) AS average FROM " . $db->table('product') . " WHERE 1";
中位数封装函数
中位数概念
中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
实现思路
- 使用sort() 对数组进行排序,再使用count()求数组长度;
- 判断数组长度是偶数还是奇数;
- 如果数组长度是偶数,那么中位数将为(数组名[(长度)/2]+数组名[((长度)/2)+1])/2;
- 如果数组长度为奇数,则中位数将是中间元素[(长度/2)-0.5
封装函数
//求中位数
function median($Arr)
{
sort($Arr, 1);
$totalNumbers = count($Arr);
$mid = floor($totalNumbers / 2);
return ($totalNumbers % 2) === 0 ? Round(($Arr[$mid - 1] + $Arr[$mid]), 2) / 2 : $Arr[$mid];
}
调用中位数函数
//求中位数;
foreach ($row as $k => $v) {
$sql_l = "select pro_price from " . $db->table('product');
$sql_l .= " WHERE cat_name = '" . $v['cat_name'] . "'";
$row_l = $db->queryall($sql_l);
//循环数组;
$data = array();
for ($i = 0; $i < count($row_l); $i++) {
$data[] = $row_l[$i]['pro_price'];
}
//求中位数;
$row[$k]["medium"] = median($data);
}
导出函数库&搜索条件
require 'libs/price.export.php';
$cat_name = $_POST['cat_name'];
$fromTime = $_POST['fromTime'];
$toTime = $_POST['toTime'];
完整代码
//导出日志;
case "exp";
require 'libs/price.export.php';
$cat_name = $_POST['cat_name'];
$fromTime = $_POST['fromTime'];
$toTime = $_POST['toTime'];
$sql = "select cat_name,MIN(pro_price) AS lowest,MAX(pro_price) AS highest,AVG(pro_price) AS average FROM " . $db->table('product') . " WHERE 1";
if ($cat_name != "") {
$sql .= " AND cat_name = '" . $cat_name . "'";
}
if ($fromTime != "") {
$sql .= " AND DATE_FORMAT(FROM_UNIXTIME(pro_month),'%Y-%m-%d') >= '" . $fromTime . "'";
}
if ($toTime != "") {
$sql .= " AND DATE_FORMAT(FROM_UNIXTIME(pro_month),'%Y-%m-%d') <= '" . $toTime . "'";
}
$sql .= " GROUP BY cat_name";
$row = $db->queryall($sql);
//求中位数;
foreach ($row as $k => $v) {
$sql_l = "select pro_price from " . $db->table('product');
$sql_l .= " WHERE cat_name = '" . $v['cat_name'] . "'";
$row_l = $db->queryall($sql_l);
//循环数组;
$data = array();
for ($i = 0; $i < count($row_l); $i++) {
$data[] = $row_l[$i]['pro_price'];
}
//求中位数;
$row[$k]["medium"] = median($data);
}
//导出;
$infoName = "Price Analysis" . date("Y.m.d");
expExcel($row, $infoName);
break;
@漏刻有时