SQL-запрос CodeIgniter - как суммировать значения за каждый месяц? - PullRequest
3 голосов
/ 21 марта 2011

У меня есть следующая таблица:

//table_1

record_id   user_id    plant_id    date        cost
1           1          1           2011-03-01   10
2           1          1           2011-03-02   10
3           1          1           2011-04-10   5
4           1          2           2011-04-15   5

Я хотел бы создать запрос (если возможно, используя CI Active Records, но с MySQL все в порядке), в котором я получаю следующий результат:

[1] => [1] => [March 2011] [20]

           => [April 2011] [5]

       [2] => [March 2011] [0]

           => [April 2011] [5]

Я пытался использовать $this->db->group_by, но мне кажется, что я не правильно его использую.

Если бы кто-нибудь мог дать мне указатель или дорожную карту, чтобы сделать это, это было бы очень признательно - спасибо!

Ответы [ 2 ]

1 голос
/ 21 марта 2011

Пример таблицы

drop table if exists t;
create table t( record_id int, user_id int, plant_id int, date datetime, cost float);
insert t select
1 ,1, 1 ,'2011-03-01', 10 union all select
2 ,1, 1 ,'2011-03-02', 10 union all select
3 ,1, 1 ,'2011-04-10', 5 union all select
4 ,1, 2 ,'2011-04-15', 5;

Поскольку вы хотите видеть строку с 0, вам необходимо выполнить перекрестное объединение между годом-месяцем и всеми пользовательскими объектами.

select up.user_id, up.plant_id, ym2, ifnull(sum(t.cost),0) totalcost
from (select distinct date_format(date, '%Y-%m') ym, date_format(date, '%M %Y') ym2 from t) dates
cross join (select distinct t.user_id, t.plant_id from t) up
left join t on date_format(t.date, '%Y-%m') = dates.ym
           and up.user_id=t.user_id
            and up.plant_id=t.plant_id
group by up.user_id, up.plant_id, ym2, ym
order by up.user_id, up.plant_id, date(concat(ym,'-1'));

Тот факт, что Month Year не сортирует правильно, также требует сложной обработки дат для целей заказа в конце.

1 голос
/ 21 марта 2011

Это довольно интенсивный способ сделать это, и было бы гораздо предпочтительнее хранить месяц-год в виде самого столбца, если вам нужно часто выполнять эти запросы, но в основном это так:

SELECT CONCAT(MONTHNAME(date), ' ', YEAR(date)) AS monthyear, COUNT(*) AS count GROUP BY YEAR(date), MONTH(date), plant_id;

Это должно дать вам набор результатов, который вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...