使用图表显示过去 12 个月的注册用户分析

Posted

技术标签:

【中文标题】使用图表显示过去 12 个月的注册用户分析【英文标题】:Show analytics of registered users for last 12 months using chart 【发布时间】:2020-03-04 20:24:55 【问题描述】:

我正在尝试从数据库中获取过去 12 个月的所有用户,并使用图表显示一些统计数据。为此,我正在使用 chartJS。

$registeredUsersData = $connection->fetchAll(
    'SELECT
    COUNT(id) AS registered_users,
    CONCAT(MONTHNAME(created_on), " ", YEAR(created_on)) AS created_on
    FROM users 
    WHERE created_on 
    BETWEEN CURDATE() - INTERVAL 12 MONTH AND CURDATE() 
    GROUP BY YEAR(created_on), MONTH(created_on)
    ORDER BY YEAR(created_on) DESC, MONTH(created_on) DESC;
');

我们通过 symfony 控制器传递它并渲染 html 模板。

$registeredUsersCount = array_column($registeredUsersData, 'registered_users');
$registeredUserMonths = array_column($registeredUsersData, 'created_on');

return $this->render('dashboard/admin/index.html.twig', [
    'registered_users_count' => $registeredUsersCount,
    'registered_users_months' => $registeredUserMonths
]);

在模板中,我尝试使用条形图显示应该组合年份和月份的数据,并分别显示在横坐标(X 轴)和纵坐标(Y 轴)上的计数。

<div class="chart-container">
    <canvas id="canvas"></canvas>
</div>

let months =  registered_users_months|json_encode|raw ;
let users =  registered_users_count|json_encode|raw ;
const ctx = document.getElementById('canvas').getContext('2d');
const myChart = new Chart(ctx, 
    type: 'bar',
    data: 
        labels: months,
        datasets: [
            label: 'Registered Users Monthly',
            data: users,
            backgroundColor: 'rgba(90, 80, 191, 0.2)',
            borderColor: 'rgba(90, 80, 191, 1)',
            borderWidth: 1
        ]
    ,
    options: 
        maintainAspectRatio: false,
        responsive: true,
        scales: 
            yAxes: [
                ticks: 
                    beginAtZero: true
                ,
            ]
        
    
);

数据已正确显示,但并非全部显示“前”12 个月。如果一个月没有注册用户,则它必须也显示,但 计数为零。不幸的是,给定的查询目前不支持该功能,我该如何修改它?

【问题讨论】:

console.log(userRegisteredData); 的输出? 这是当前输出:prnt.sc/rbol0o 所以,对我来说,您需要获取结果数组并将其与预设数组碰撞,以检查缺少哪些月份并将其弹出到结果集中...您可以在返回控制器之前的模型。听起来合理吗? 听起来像是一个解决方案,但我想尝试一些更优雅的方式。 ***.com/questions/27600863/… 【参考方案1】:

您需要在查询中进行如下更改:


$start = new DateTime(date('Y-m-d'));
$end = new DateTime(date('Y-m-d'));
$end->modify('+12 month');

$interval = DateInterval::createFromDateString('1 month');
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) 
    $registeredUsersData[$dt->format('Y-m')] = 0;


$registeredUsersData = $connection->fetchAll(
    'SELECT
    COUNT(id) AS registered_users,
    DATE_FORMAT(created_on,'%Y-%m') AS created_on
    FROM users 
    WHERE created_on BETWEEN CURDATE() - INTERVAL 12 MONTH AND CURDATE() 
    GROUP BY DATE_FORMAT(created_on,'%Y-%m')
    ORDER BY DATE_FORMAT(created_on,'%Y-%m') DESC;
');

foreach($registeredUsersData as $registeredUser) 
    $registeredUsersData[$registeredUser['created_on']] = $registeredUser['registered_users'];
   

return $this->render('dashboard/admin/index.html.twig', [
    'registered_users_count' => array_values($registeredUsersData),
    'registered_users_months' => array_keys($registeredUsersData)
]);

我还更新了你的 php 有 12 个月的所有日期

【讨论】:

它不起作用。你能提供更优雅的方法吗?【参考方案2】:

比起雄辩,我更像是穴居人编码员,但我相信这会在不更改查询的情况下获得您正在寻找的结果集...在您的查询之后添加此内容以将新数据集发送到您的控制器。

for ($i = 1; $i < 12; $i++) 
    $monthToCheck[$i]['registered_users'] = 0;
    $monthToCheck[$i]['month_of_creation'] = date("F", strtotime( date( 'Y-m-01' )." -$i months"));
    $monthToCheck[$i]['year_of_creation'] = date("Y", strtotime( date( 'Y-m-01' )." -$i months"));


 return (array_merge($registeredUsersData,$monthToCheck));

【讨论】:

以上是关于使用图表显示过去 12 个月的注册用户分析的主要内容,如果未能解决你的问题,请参考以下文章

获取按月分组的最近 12 个月的数据,即使为 0

注册免费试用12个月的亚马逊AWS云计算服务

oracle 中过去 12 个月的日期

Qlikview 滚动 12 个月财政

MySQL礼品电商用户行为分析

使用 oracle 获取过去 12 个月的计数及其差异