【问题标题】:Get totals of each month a year including the month with no result获取一年中每个月的总计,包括没有结果的月份
【发布时间】:2020-03-25 20:37:00
【问题描述】:

我想回复每月创建的发票总数。

到目前为止,下面的代码正在运行,但如果一个月内没有结果,我需要一个 0。

$sql = "SELECT MONTH( invoice_date ) AS MONTH, SUM(`invoice`.`total`) as total
    FROM `invoices`
    WHERE YEAR(invoice_date) = '2019'
    GROUP BY MONTH(invoice_date)";
$result = mysqli_query($con,$sql);
while($data = mysqli_fetch_array($result))
{
    $total = $data['total'];
    $month = $data['month'];
}

我想要的是这个:

Jan 500
Feb 300
Mar 0
Apr 500
etc...

我得到的是这个

500 年 1 月 2 月 300 日 4 月 500 日

...因为我的数据库中没有带有 Mar 的条目。

如果我每个月都在循环中进行查询,它工作正常,但我知道我不应该这样使用它,还有更好的方法!?

【问题讨论】:

  • 因为您的发票表中没有 Mar 条目,所以它没有可供选择的内容。该查询无法显示您的查询表中没有的内容。

标签: php mysql


【解决方案1】:

使用UNION ALL 创建一个查询,返回所有月份编号 1-12 和 LEFT JOIN 到您的查询:

SELECT m.MONTH, COALESCE(t.total, 0)
FROM (
  SELECT 1 AS MONTH UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL 
  SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL
  SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
) AS m LEFT JOIN (
  SELECT MONTH( invoice_date ) AS MONTH, SUM(`invoice`.`total`) as total
  FROM `invoices`
  WHERE YEAR(invoice_date) = '2019'
  GROUP BY MONTH(invoice_date)
) AS t ON t.MONTH = m.MONTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多