Мне нужно сделать отчет с общим объемом продаж за месяц, с нулевым значением для месяцев без продаж. Это вопрос, с которым я работаю до сих пор, и я чувствую, что перепробовал каждую комбинацию безуспешно. Мне нужны месяцы в одном массиве и продажи для каждого месяца в другом массиве для целей моего отчета.
запрос:
$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, чтобы я все еще получал все месяцы?
Вы можете получить нулевые значения, используя следующий запрос:
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
,Я также ввел псевдонимы таблиц, которые упрощают написание и чтение запросов.
Других решений пока нет …