mysql高级进阶:php语句操作mysql进行最大值、最小值、平均值和中位数的报表导出方案_php

项目需求

  • 求不同产品名称价格的最大值、最小值、平均值和中位数;

代码分解

最大值、最小值、平均值

在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)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。

实现思路

  1. 使用sort() 对数组进行排序,再使用count()求数组长度;
  2. 判断数组长度是偶数还是奇数;
  3. 如果数组长度是偶数,那么中位数将为(数组名[(长度)/2]+数组名[((长度)/2)+1])/2;
  4. 如果数组长度为奇数,则中位数将是中间元素[(长度/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);
}

导出函数库&搜索条件

mysql高级进阶:php语句操作mysql进行最大值、最小值、平均值和中位数的报表导出方案_开发语言_02

require 'libs/price.export.php';
$cat_name = $_POST['cat_name'];
$fromTime = $_POST['fromTime'];
$toTime = $_POST['toTime'];

mysql高级进阶:php语句操作mysql进行最大值、最小值、平均值和中位数的报表导出方案_sql_03

完整代码

//导出日志;
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;

@漏刻有时