1

我正在查看一个非常简单的 PHP 代码,它使用我们的计费系统的 API 来生成图表。截至目前,它显示了每个工作人员的平均票务评级。我想将其更改为仅显示本年度每月的平均票价。

同一个表中有一个“日期”字段,其中包含为每张工单格式化的值,例如“2010-08-23 00:48:22”。

我将如何更改此代码以显示给定年份的每月平均票务评级?

<?php

if (!defined("WHMCS"))
    die("This file cannot be accessed directly");

$description = "This graph shows average support ratings by staff member";

if ($statsonly) { return false; }

$chartdata = array();

$query  = "SELECT DATE_FORMAT(date, '%m-%Y') AS theMonth, AVG(rating) AS avgRating ";
$query .= "FROM tblticketreplies WHERE admin != '' AND rating !='0' ";
$query .= "GROUP BY DATE_FORMAT(date, '%m-%Y') ";
$query .= "ORDER BY avgRating ASC";
$result = mysql_query($query);

//$query = "SELECT admin, AVG(rating) AS avgrating FROM `tblticketreplies` WHERE admin != '' AND rating!='0' GROUP BY admin ORDER BY avgrating ASC";
//$result = mysql_query($query);

while ($data = mysql_fetch_array($result))
{
    $chartdata[$data[0]] = round($data[1],2);
}

$graph=new WHMCSGraph(650,400);
$graph->addData($chartdata);
$graph->setTitle("Average Support Ticket Ratings by Month");
$graph->setGradient("lime", "green");
$graph->setDataValues(true);
$graph->setXValuesHorizontal(true);

?>
4

1 回答 1

0

您需要首先更改您的查询以返回每月的平均评分,而不是像现在这样每个“管理员”的平均评分。我不知道数据库中包含日期的列的名称,但可以说它名为“MyDateColumn”。

要获得每月平均值,您需要一个类似于以下内容的查询:

$query  = 'SELECT DATE_FORMAT(MyDateColumn, "%m-%Y") AS theMonth, AVG(rating) AS avgRating ';
$query .= 'FROM tblticketreplies ';
$query .= 'GROUP BY DATE_FORMAT(MyDateColumn, "%m-%Y") ';
$query .= 'ORDER BY avgRating ASC';

DATE_FORMAT函数提供了魔力。它将“MyDateColumn”格式化为 MM-YYYY(例如“06-2011”)。在 GROUP BY 中使用相同的格式来完成查询。

更改setTitle代码部分以标记来自查询的新数据:

$graph->setTitle("Average Support Ticket Ratings per Month");

另外,请注意我从您的查询中删除了 WHERE 子句。在它排除具有空“管理员”或空评级的“ticketreplies”之前。您应该根据要包含在图表中的数据来评估将其添加回查询中。

希望这会有所帮助。

~~ 编辑:

解决下面的评论 - 上面的查询按 排序avgRating,因此您的图表将始终从低评级值变为高评级值。要将其从最早的月份转到最近的月份,请更新ORDER BY. 使用ORDER BY DATE_FORMAT(MyDateColumn, "%Y-%m"). 此处颠倒以%Y-%m确保排序正常工作。年份是这里最重要的元素,所以它排在第一位。较不重要的月份元素排在最后。

最后,要将图表限制为仅当前用户,请在子句和WHERE子句之间添加子句。使用:这指示 MySQL 仅在日期的年份与当前日期的年份相同时才考虑表中的元素。FROMGROUP BYWHERE YEAR(MyDateColumn) = YEAR(CURDATE())MyDateColumn

一定要对MySQL 日期时间函数进行审查。以后你会感谢自己的。=)

于 2011-06-23T05:39:21.457 回答