【问题标题】:Mysql Left Join for table of sales by month with empty monthsMysql Left Join 用于按月和空月的销售表
【发布时间】:2014-11-07 02:45:31
【问题描述】:

我需要制作一份包含当月总销售额的报告,对于没有销售额的月份,我的值为零。到目前为止,这是我正在使用的查询,我觉得我已经尝试了所有组合,但没有运气。为了我的报告目的,我需要 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 子句放在哪里,这样我仍然可以得到所有月份?

【问题讨论】:

  • 数据库中是否已经有所有 tne 个月?如果不需要月份表,基本上是 12 个整数。
  • 任何提示为什么它会为 monthnum 列返回空值?完全没有意义
  • @sergio0983 我认为是这个小组搞砸了,但我不确定。
  • 您正在执行 GROUP BY MONTH(orders.closeddate),但在一个月内没有任何订单为空。您需要改为GROUP BYmonths.monthnum
  • orders.status = 'Closed' 的检查放入 JOIN 的 ON 子句而不是 WHERE 子句。这将排除联接之前而不是联接之后的行。

标签: php mysql arrays left-join


【解决方案1】:

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

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

我还介绍了表别名,它使查询更易于编写和阅读。

【讨论】:

  • 这两个数组都返回了 null :( 我不明白为什么如果我将订单表加入到月份表中,它为什么不显示所有月份。
猜你喜欢
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多