Найти сумму значений за каждый отдельный месяц

scorpion-ds

Новичок
Есть таблица, где имеется прибыль по дням, необходимо получить сумму прибыли за каждый отдельный месяц.

Мне что-то не приходят в голову красивые запросы, пока только множество условий between, вложенные запросы или "группировать" уже на уровне PHP.
 

scorpion-ds

Новичок
Извиняюсь, вопрос снимается, все решается проще некуда:
Код:
SELECT id, office_id, SUM(value), reporting_date FROM fc.fc_office_revenue WHERE office_id = 56 GROUP BY MONTH(reporting_date);
 

scorpion-ds

Новичок
Действительно.

Изменил на:
Код:
SELECT id, office_id, SUM(value), reporting_date FROM fc.fc_office_revenue WHERE office_id = 56 GROUP BY MONTH(reporting_date), YEAR(reporting_date);
 

MiksIr

miksir@home:~$
Если группировать так, то в нормальных СУБД будет ошибка "наличие неагрегированных столбцов".
 

scorpion-ds

Новичок
Тогда пусть так:
Код:
SELECT SUM(value) as `value`, CONCAT(YEAR(reporting_date), '-', RPAD('0', 2, MONTH(reporting_date))) AS `date` FROM fc.fc_office_revenue WHERE office_id = 56 GROUP BY MONTH(reporting_date), YEAR(reporting_date) ORDER BY reporting_date;
 

scorpion-ds

Новичок
Удивлен, но когда все я решил применить к Doctrine 2, то узнал, что из коробки про YEAR, MONTH и RPAD, он не знает и ругается при их использовании, с первыми двумя я его подружил, частично он все равно не позволяет группировать с использованием YEAR и MONTH, пришлось перенести их в SELECT и потом через псевдонимы уже группировать, а вот RPAD он похоже знать не хочет, но без него в общем-то можно обойтись.

Как-то так вышло:
PHP:
public function getGroupByMonth($officeId, $limit = null)
    {
       
        $qb = $this->createQueryBuilder('office_r')
            ->select('office_r.value AS reportValue, CONCAT(YEAR(office_r.reportingDate), \'-\', MONTH(office_r.reportingDate)) AS reportDate, MONTH(office_r.reportingDate) AS HIDDEN gMonth, YEAR(office_r.reportingDate) AS HIDDEN gYear')
        ;

        $qb
            ->where($qb->expr()->eq('office_r.office', ':office'))
            ->groupBy('gMonth')
            ->addGroupBy('gYear')
            ->setParameter('office', $officeId)
        ;

        if($limit)
        {
            $qb->setMaxResults($limit);
        }

        return $qb->getQuery()->getScalarResult();
    }
 

WMix

герр M:)ller
Партнер клуба
PHP:
CONCAT(YEAR(office_r.reportingDate), '-', MONTH(office_r.reportingDate))
извращенец
PHP:
SUBSTRING(office_r.reportingDate, 1, 7)
 

artoodetoo

великий и ужасный
Код:
DATE_FORMAT(d,'%Y-%m')
а если надо оставить результат сравнимым с другими датами, то типа
Код:
(d - INTERVAL DAYOFMONTH(d)-1 DAY)
 
Последнее редактирование:
Сверху