Mysql Left按月加入销售表,空月

时间:2014-11-06 13:56:48

标签: 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.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"]]

如何让它显示第一个数组中的所有月份,以及第二个数组中没有销售数月的零?我认为它的GROUP BY杀了我,但我需要这个来累计销量。救命!

PS我知道我应该停止使用mysql,我会在这个项目完成后立即使用。谢谢!

编辑

var_dump结果:

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子句,以便我仍然可以获得所有月份?

1 个答案:

答案 0 :(得分:3)

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

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子句。
  • 聚合使用months表而不是orders表。
  • 总使用coalesce()获得0而不是NULL

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