Mysql Left Join для таблицы продаж по месяцам с пустыми месяцами

Мне нужно сделать отчет с общим объемом продаж за месяц, с нулевым значением для месяцев без продаж. Это вопрос, с которым я работаю до сих пор, и я чувствую, что перепробовал каждую комбинацию безуспешно. Мне нужны месяцы в одном массиве и продажи для каждого месяца в другом массиве для целей моего отчета.

запрос:

$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

Решение

Вы можете получить нулевые значения, используя следующий запрос:

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,

Я также ввел псевдонимы таблиц, которые упрощают написание и чтение запросов.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]