Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql按月份左联接销售表,月份为空_Php_Mysql_Arrays_Left Join - Fatal编程技术网

Php Mysql按月份左联接销售表,月份为空

Php Mysql按月份左联接销售表,月份为空,php,mysql,arrays,left-join,Php,Mysql,Arrays,Left Join,我需要做一个月总销售额的报告,没有销售额的月份的值为零。这就是我目前正在处理的问题,我觉得我尝试了每一种组合都没有运气。我需要1个数组中的月份以及另一个数组中每个月的销售额,以用于我的报告目的 查询: $productSql = "SELECT months.monthnum, SUM(orders.total) FROM months LEFT JOIN orders ON months.monthnum = MONTH(orders.closeddate) WHERE orders.stat

我需要做一个月总销售额的报告,没有销售额的月份的值为零。这就是我目前正在处理的问题,我觉得我尝试了每一种组合都没有运气。我需要1个数组中的月份以及另一个数组中每个月的销售额,以用于我的报告目的

查询:

$productSql = "SELECT months.monthnum, SUM(orders.total) FROM months LEFT JOIN orders ON months.monthnum = MONTH(orders.closeddate) WHERE orders.status = 'Closed' GROUP BY MONTH(orders.closeddate) ORDER BY months.monthnum ASC";
$productResult = mysql_query($productSql, $link);

while($productRow = mysql_fetch_array($productResult)){

$label[] = $productRow['months.monthnum'];
$data[] = $productRow['SUM(orders.total)'];
};

echo "[".json_encode($label).",".json_encode($data)."]";
结果:

[[null,null],["6000.00","3100.00"]]
如何让它在第一个数组中显示所有月份,而在第二个数组中没有销售的月份显示零?我想这群人要了我的命,但我需要这些来增加销售额。救命啊

PS我知道我应该停止使用mysql,我会尽快完成这个项目。谢谢

编辑

变量转储结果:

array(1) { [0]=> NULL } array(1) { [0]=> string(7) "6000.00" } array(2) { [0]=> NULL [1]=> NULL } array(2) { [0]=> string(7) "6000.00" [1]=> string(7) "3100.00" }
编辑2


所以问题在于WHERE子句。我需要where子句,因为我只需要已关闭的订单。当我把WHERE子句去掉时,它显示了所有没有销售的月份的零,并且正确地计算了有销售的月份。然而,它包括所有订单,而不仅仅是关闭的订单。我应该将Where子句放在哪里,这样我仍然可以得到所有月份?

您可以使用以下查询获得零值:

SELECT m.monthnum, coalesce(SUM(o.total), 0)
FROM months m LEFT JOIN
     orders o
     ON m.monthnum = MONTH(o.closeddate) AND o.status = 'Closed'
GROUP BY m.monthnum
ORDER BY m.monthnum ASC";
有三个重大变化:

  • o.status
    的比较移动到
    on
    子句
  • 聚合使用
    表,而不是
    订单
  • 总计使用
    coalesce()
    得到0,而不是
    NULL

我还引入了表别名,这使查询更易于编写和读取。

您可以使用以下查询获得零值:

SELECT m.monthnum, coalesce(SUM(o.total), 0)
FROM months m LEFT JOIN
     orders o
     ON m.monthnum = MONTH(o.closeddate) AND o.status = 'Closed'
GROUP BY m.monthnum
ORDER BY m.monthnum ASC";
有三个重大变化:

  • o.status
    的比较移动到
    on
    子句
  • 聚合使用
    表,而不是
    订单
  • 总计使用
    coalesce()
    得到0,而不是
    NULL

我还引入了表别名,这使查询更易于编写和读取。

您可以使用以下查询获得零值:

SELECT m.monthnum, coalesce(SUM(o.total), 0)
FROM months m LEFT JOIN
     orders o
     ON m.monthnum = MONTH(o.closeddate) AND o.status = 'Closed'
GROUP BY m.monthnum
ORDER BY m.monthnum ASC";
有三个重大变化:

  • o.status
    的比较移动到
    on
    子句
  • 聚合使用
    表,而不是
    订单
  • 总计使用
    coalesce()
    得到0,而不是
    NULL

我还引入了表别名,这使查询更易于编写和读取。

您可以使用以下查询获得零值:

SELECT m.monthnum, coalesce(SUM(o.total), 0)
FROM months m LEFT JOIN
     orders o
     ON m.monthnum = MONTH(o.closeddate) AND o.status = 'Closed'
GROUP BY m.monthnum
ORDER BY m.monthnum ASC";
有三个重大变化:

  • o.status
    的比较移动到
    on
    子句
  • 聚合使用
    表,而不是
    订单
  • 总计使用
    coalesce()
    得到0,而不是
    NULL

我还引入了表别名,这使查询更易于编写和读取。

数据库中是否已经有所有月份?如果没有,则需要月份表,通常为12个整数。有任何提示,为什么它会为monthnum列返回空值?根本没有意义all@sergio0983我认为是group by搞砸了,但我不确定。你是按月进行分组(orders.closeddate),但如果没有订单,则该月将为空。您需要改为按months.monthnum分组。将orders.status='Closed'的检查放入JOIN的ON子句中,而不是WHERE子句中。这将排除联接之前的行,而不是联接之后的行。数据库中是否已经有所有月份?如果没有,则需要月份表,通常为12个整数。有任何提示,为什么它会为monthnum列返回空值?根本没有意义all@sergio0983我认为是group by搞砸了,但我不确定。你是按月进行分组(orders.closeddate),但如果没有订单,则该月将为空。您需要改为按months.monthnum分组。将orders.status='Closed'的检查放入JOIN的ON子句中,而不是WHERE子句中。这将排除联接之前的行,而不是联接之后的行。数据库中是否已经有所有月份?如果没有,则需要月份表,通常为12个整数。有任何提示,为什么它会为monthnum列返回空值?根本没有意义all@sergio0983我认为是group by搞砸了,但我不确定。你是按月进行分组(orders.closeddate),但如果没有订单,则该月将为空。您需要改为按months.monthnum分组。将orders.status='Closed'的检查放入JOIN的ON子句中,而不是WHERE子句中。这将排除联接之前的行,而不是联接之后的行。数据库中是否已经有所有月份?如果没有,则需要月份表,通常为12个整数。有任何提示,为什么它会为monthnum列返回空值?根本没有意义all@sergio0983我认为是group by搞砸了,但我不确定。你是按月进行分组(orders.closeddate),但如果没有订单,则该月将为空。您需要改为按months.monthnum分组。将orders.status='Closed'的检查放入JOIN的ON子句中,而不是WHERE子句中。这将排除联接之前的行,而不是联接之后的行。这对两个数组都返回了null:(我不明白,如果让我将orders表联接到months表,为什么它不显示所有月份。这对两个数组都返回了null:(我不明白如果我将orders表加入months表,为什么它不显示所有月份。这两个数组都返回null:(我不明白如果我将orders表加入months表,为什么它不显示所有月份。这两个数组都返回null:(我不明白为什么它不显示。)