【问题标题】:Get all months from a query including zero counts从查询中获取所有月份,包括零计数
【发布时间】:2018-12-17 08:20:11
【问题描述】:

我现在有这个问题:

SELECT DATE_FORMAT(`dataNl`, \'%Y%m\') AS `Ym`, COUNT(*) AS `totale`
FROM `noleggio`
GROUP BY `Ym`

这有助于获取每个月的数据,但如果一个月的值为 0,则数据库中不存在此数据,因此无法获取。我需要一个查询来添加剩余月份,将COUNT 字段设置为0

我编写了一个 PHP 代码来将具有 0 值的月份添加到数组中,但它仅在年份只有一个时才有效,如果我想获得更多,这需要很多棘手的代码,我认为可能有一个用 SQL 解决。

这是 PHP 代码:

$t = array();
$m = array();
foreach ($months as $val) {
    $t[] = $val['totale'];
    $m[] = $val['Ym'];
}

for ($i = 0; $i < 12; ++$i) {
    if (in_array($i + 201801, $m) == false) {
        array_splice($t, $i, 0, 0);
    }
}

【问题讨论】:

  • 在 count >= 0 的查询中添加having 子句。
  • 您需要一个日历表。如果你谷歌它,有很多例子如何制作和使用。
  • 按月添加组
  • @RevathiGanesh 我试过但没用
  • 创建月份帮助表,其中包含所有需要的月份。外部连接该表。

标签: php mysql sql datetime mysqli


【解决方案1】:

这是一个 PHP 解决方案,它需要数据库中的最小和最大日期:

// use the query SELECT MIN(dataNl), MAX(dataNl) FROM ... to
// find the first and last date in your data and use them below
$dates = new DatePeriod(
    DateTime::createFromFormat('Y-m-d|', '2018-01-15')->modify('first day of this month'),
    new DateInterval('P1M'),
    DateTime::createFromFormat('Y-m-d|', '2018-12-15')->modify('first day of next month')
);

// assuming $rows contain the result of the GROUP BY query...
foreach ($dates as $date) {
    $datestr = $date->format('Ym');
    $index = array_search($datestr, array_column($rows, 'Ym'));
    if ($index === false) {
        echo $datestr . ' -> 0' . PHP_EOL;
    } else {
        echo $datestr . ' -> ' . $months[$index]['totale'] . PHP_EOL;
    }
}

【讨论】:

    【解决方案2】:

    试试下面的查询:

    SELECT DATE_FORMAT(`dataNl`, \'%Y%m\') AS `Ym`, COUNT(*) AS `totale`
    FROM `noleggio`
    GROUP BY MONTH(`dataNl`)
    

    【讨论】:

    • 我只得到数据库中倒数第二个元素
    • @L.Antonelli 我已经更新了答案。请尝试更新后的代码。
    • 现在我得到的结果与我的查询相同,只是现有月份。我认为分组对我没有帮助,因为我需要“从头开始”创建不存在的月份。我的数据库的日期像“12-01-2018, 15-01-2018, 22-03-2018”,02 月不存在,我怎么能得到这个?
    猜你喜欢
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多