Всем привет. Ребят подскажите пожалуйста как можно сгруппировать сумму за каждый месяц ['месяц.год', общая сумма за этот месяц.год] Необходимо прийти к виду: ['04.2019', 65], ['05.2019', 15], ['06.2019', 57], ['07.2019', 200] у меня же получается следующее: ['04.2019', 15], ['04.2019', 50], ['05.2019', 7], ['05.2019', 8], ['06.2019', 12], ['06.2019', 45], ['07.2019', 37], ['07.2019', 92], ['07.2019', 71] То есть у меня просто вывод ['дата', сумма], а нужно ['месяц.год', общая сумма за этот месяц.год] Дата в unix мой код Код (Text): $sql=$mgrdb->query("SELECT * FROM `services_bill` WHERE `status`='3' and `paytypekassa`='1'"); $row2=$sql->fetchAll(PDO::FETCH_ASSOC); $arr = array(); foreach($row2 as $row){ $datatime = date("m.Y", $row['date']); $arr[] = "['".$datatime."', {$row['amount']}]"; } $stats = implode(", ", $arr); $DATA['stats'] = $stats;
Мне нужна не общая сумма, а за каждый месяц, ['период', сумма]. Общую сумму получаю в запросе: "SELECT SUM(`amount`) AS summ FROM `services_bill` WHERE `status`='3' and `paytypekassa`='1'" а как получить сумму каждого месяца не знаю --- Добавлено --- Не получается у меня, из за нехватки знаний) К примеру сумму дохода за сегодня я получаю так: Код (Text): $day1 = strtotime("today 00:00"); $sqlday1 = $mgrdb->query("SELECT SUM(`amount`) AS summ, `date` FROM `services_bill` WHERE `date`>= '".$day1."' and `status`='3' and `paytypekassa`='1'"); за вчерашний день так: Код (Text): $day2 = strtotime("today -1 day"); $sqlday2 = $mgrdb->query("SELECT SUM(`amount`) AS summ, `date` FROM `services_bill` WHERE `date`> '".$day2."' and `date`<'".$day1."' and `status`='3' and `paytypekassa`='1'"); Даход за всё время: Код (Text): $sql_amount = $db->query("SELECT SUM(`amount`) AS summ FROM `services_bill` WHERE `status`='3' and `paytypekassa`='1'"); А для графика мне необходимо получить данные вида: ['04.2019', 65], ['05.2019', 15], ['06.2019', 57], ['07.2019', 200] не знаю как это сделать
Пример можете подсказать? Я пробовал так: Код (Text): $sqlday1 = $mgrdb->query("SELECT SUM(`amount`) AS summ, `date` FROM `services_bill` WHERE `date`>= MONTH(`date`) and `status`='3' and `paytypekassa`='1' GROUP BY MONTH(date)"); Не получается --- Добавлено --- нехватка знаний)
Первое простое условие какое-то странное. Чтобы не мешались месяцы разных лет, достаточно выбирать записи за последний год или просто не хранить старые записи в осн. таблице. Также можно выбирать записи за конкретный год.
Пробую запрос: SELECT format(date,'MM.yyyy') AS Mjesec, SUM(amount) AS summ FROM services_bill WHERE `status`='3' and `paytypekassa`='1' GROUP BY format(date,'MM.yyyy') какая то белиберда получается) весь код: Код (Text): $sql=$mgrdb->query(" SELECT format(date,'MM.yyyy') AS Mjesec, SUM(amount) AS summ FROM services_bill WHERE `status`='3' and `paytypekassa`='1' GROUP BY format(date,'MM.yyyy') "); $row2=$sql->fetchAll(PDO::FETCH_ASSOC); $arr = array(); foreach($row2 as $row){ $arr[] = "['{$row['Mjesec']}', {$row['summ']}]"; } $stats = implode(", ", $arr); $DATA['stats'] = $stats; результат на скриншоте Может кто то подскажет как сформировать правильно запрос?
@Mirnyi, какой тип имеют данные в поле `date` таблицы `services_bill`? --- Добавлено --- Посмотрите на 6-ю строку приведённого в первом сообщении кода. Выполняется преобразование функцией date(). --- Добавлено --- В MySQL тоже есть функции для обработки даты.
Ф-цию выбрали явно неподходящую. Попробуйте в лоб: сделайте динамическое поле, исходя из выражения год*100+месяц, по которому и группируйте, и сортируйте. Ссылку для оплаты моего пивасика скину в личку --- Добавлено --- P.S. Преобразовывать полученные числа в формат 'MM.YYYY' можно на пыхе, объединяя с суммами. Можно все это и на мускуле сделать, тогда вам отдельное поле с суммами вообще не нужно, если вы не планируете по нему сортировать. Поле с числами год-месяц можно получить и при помощи ф-ции форматирования даты. Только не забудьте ее обрамить ф-цией преобразования строки в число.
А должно получаться именно то, о чём ты просил ))) SQL запрос правдоподобный. Только от названия Mjesec хочется блевать, а так - вполне ничего себе. Имей в виде только, что группировка создаёт неявную сортировку и в твоём случае сначала будет отсортировано по месяцу, затем по году. А логично было бы выставить год вперёд как 'yyyy.mm'. Сами суммы будут правильные в любом случае. Edited: DATE_FORMAT() Подсказка: во фразе group by ты можешь указать просто номер колонки из фразы select. В твоём случае это GROUP BY 1
@Mirnyi, ах, да, там-же написано, что "Дата в unix" Вот выражение: date_format(from_unixtime(`date`),'%Y.%m')
@Sail, from_unixtime сама поддерживает заказное форматирование --- Добавлено --- По-моему все же лучше писать интуитивно понятно: Код (Text): ORDER BY `Mjesec` Хотя ты прав в том, что потом ХП, что такое Mjesec --- Добавлено --- @Mirnyi, пиши все имена полей и т.п. в «косых кавычках» (см. мой пример кода выше), чтобы они не конфликтовали с именами ф-ций и т.п.
Спасибо большое ребят, очень помогли! Всё работает как надо. Sail, miketomlin и artoodetoo напишите в лс Qiwi, кину по паре соток на пивко) Mjesec - это название я взял из примера который нагуглил) Готовый код (в график выводиться год.месяц и сумма) Код (Text): $sql=$mgrdb->query(" SELECT date_format(from_unixtime(`date`),'%Y.%m') AS `date`, SUM(amount) AS `sum` FROM `services_bill` WHERE `status`='3' and `paytypekassa`='1' GROUP BY 1 "); $row2=$sql->fetchAll(PDO::FETCH_ASSOC); $arr = array(); foreach($row2 as $row){ $arr[] = "['{$row['date']}', {$row['sum']}]"; } $stats = implode(", ", $arr); $DATA['stats'] = $stats; Другой вариант, тоже работает. Готовый код (в график выводиться месяц.год и сумма) Код (Text): $sql=$mgrdb->query(" SELECT date_format(from_unixtime(`date`),'%m.%Y') AS `date`, SUM(amount) AS `sum` FROM `services_bill` WHERE `status`='3' and `paytypekassa`='1' GROUP BY date_format(from_unixtime(`date`),'%Y.%m') "); $row2=$sql->fetchAll(PDO::FETCH_ASSOC); $arr = array(); foreach($row2 as $row){ $arr[] = "['{$row['date']}', {$row['sum']}]"; } $stats = implode(", ", $arr); $DATA['stats'] = $stats;
Попробуйте учесть мое замечание по поводу from_unixtime: Код (Text): SELECT from_unixtime(`date`,'%m.%Y') AS `date` И группировать/сортировать все же лучше по числам: Код (Text): SELECT from_unixtime(`date`,'%Y%m')+0 `month`, SUM(`amount`) `sum` WHERE ... GROUP BY `month` ORDER BY `month` Можно и разделить значения для представления и значения для группировки/сортировки прямо в запросе. --- Добавлено --- Хотя значения вроде 201907 хорошо подходят и для ф-ции представления на пыхе.