我需要制作一份月份总销售额的报告,零个月没有销售额。这是我到目前为止所使用的查询,我觉得我已经尝试了所有组合而没有运气。我需要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子句,以便我仍然可以获得所有月份?
答案 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
。我还引入了表别名,这使得查询更容易编写和阅读。